1

当我们在我们的团队解决方案中实现目前未被其他类使用的方法时,访问修饰符应该是公共的还是私有的?我相信“一个公共成员说这个成员代表了这个对象提供的关键的、记录在案的功能。”。我们只将“实现细节”方法设为私有,所有将来可能有用的方法都应该公开,即使现在其他类中没有我们方法的消费者。但是我的对手说这样的方法应该是私有的。你怎么想?

补充:让我们更具体一点。例如有一个类SqlHelper。其中有用于操作 SQL Server 的有用功能。特别是使用到 SQL 服务器的连接。但不仅在那个班级。

例如,我需要实现将处理 SqlExeptions 的公共静态 HandleSqlExeption 方法(现在仅适用于 SqlHelper 类)。但是我希望在所有在异常处理中使用 SQL 连接进行操作的类中都将使用此方法(而不是简单的,例如:catch (Exception) { MsgBox {"SqlError"}; 现在某处发生了。所以我认为公共访问修饰符会告诉其他同事他们可以使用此方法。私有将隐藏该方法。如果有人要求使用这种方法,我将需要更改代码并重新构建程序集。为什么?只有底片。

4

5 回答 5

10

通常,您应该使用尽可能少的许可访问修饰符进行编码。

  • 如果该方法未在类外使用,则将其设为private.
  • 如果该方法需要通过继承类型来使用,请使其protected.
  • 如果该方法将仅在程序集中使用,则将其设为internal.
  • 仅当该方法要在程序集之外使用时才应使用public

这有助于信息隐藏,并允许您随意更改实现。

我听说这被描述为保护你的私人。


在 API 设计方面,您应该拥有一个完整的 API,将所有逻辑功能公开为public- 这就是为什么您应该在 .NET 中使用接口进行 API 设计,因为所有接口成员都必须是 .NET 接口public。在实现类时,对不属于接口的任何成员使用上述经验法则——除非它们构成接口的逻辑部分,就其使用者而言。


因此,如果您今天正在使用一种方法,那么您应该有一个具有相同Read可访问性的补充Write方法。这是一个很好的设计(对称和预期),但是如果公共方法使用它们,你应该如何读取或写入私有方法。

于 2013-01-23T09:40:54.147 回答
1

如果一个类有一些东西要暴露给外界,那么就让它公开,否则就是私有的。它取决于类的功能和目的,而不是当前或未来的要求。

于 2013-01-23T09:50:47.450 回答
1

根据名称描述的方法的性质使用公共和私有。

public当该方法可以暴露给其他对象时

private当其他对象不应该访问该方法时。

如果您的对象需要更安全,请使用private访问说明符。您还应该了解protected访问说明符,它的不同之处在于,这些方法只能由继承它们的对象访问。

于 2013-01-23T09:42:10.587 回答
1

这是一个判断电话。一般来说,如果它在逻辑上是类为获取它提供的功能而呈现的接口的一部分,那么即使它没有当前用户,它也应该是公共的。这将减少每次您想要将其用于您已经在使用它的基本相同的事情时都需要修改该类的机会。

然而,这是有代价的。您公开的每个功能都是您承诺提供的功能。如果将来您决定将其从公共界面中删除,您可能会破坏调用者。

例如,考虑一个地图类。假设您目前没有任何调用者需要知道地图中的项目数,并且您当前的实现有一个size您可以轻松返回的变量。您可以添加一个getSize返回地图大小的函数。它在逻辑上是地图类公开的功能的一部分。因此,即使当前调用者不需要知道大小,人们也可以争辩说它应该是公开的。

但是,完全有可能未来的实现可能希望摆脱该size变量。也许增加和减少大小的开销很大,并且实现更改为不需要知道大小。如果您公开getSize了函数并调用了它,那么即使您不需要它,您也必须继续跟踪它的大小,或者使该函数非常昂贵,不得不实际计算大小。

假设很多代码需要知道表是否为空,并且isEmpty为此目的提供了一个函数。经验表明,如果你也提供一个getCount功能,人们会getCount() == 0代替isEmpty. 这在今天可能没有任何区别,但它可能会限制您未来的实现选择以保持getCountisEmpty.

如果可能的话,我强烈建议您将其公开,如果您可以轻松想象该类的未损坏用户将受益于访问该功能并且它构成该类提供的功能的逻辑部分。否则,无论如何,您以后都可以轻松添加它。所以不要过分强调它。这在很大程度上是一个风格问题,混合着试图预测未来。

于 2013-01-23T10:05:03.230 回答
0

面向对象开发的基本原则;一个类的实例应该只公开它的客户需要访问的内容。查看链接并搜索“封装”。

于 2013-01-23T09:43:59.003 回答