什么时候我们应该使用公共和私人?

时间:2013-01-23 09:39:58

标签: c# .net coding-style

当我们实现现在不在我们团队解决方案中的其他类使用的方法时,Access修饰符应该是公共还是私有? 我相信“公众成员说这个成员代表了这个对象提供的关键,记录的功能。”我们只使用私有的“实现细节”方法和所有可能在将来有用的方法我们应该公开,即使现在我们的方法在其他类中没有消费者。但我的对手说这种方法应该是私人的。你觉得怎么样?

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

例如,我需要实现公共静态HandleSqlExeption方法(现在仅用于类SqlHelper),它将处理SqlExeptions。但我希望在所有类中,在异常处理中有SQL连接的操作将使用此方法(而不是它很简单,例如:     catch(Exception){MsgBox {“SqlError”}; 因为某处现在发生了。所以我认为公共访问修饰符会告诉其他同事他们可以使用这种方法。而私人将隐藏这种方法。如果有人要求使用tsuch方法,我将需要ti更改代码和重新组装。为什么?只有负面因素。

5 个答案:

答案 0 :(得分:10)

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

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

这有助于information hiding,并允许您随意更改实施。

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


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


因此,如果您今天使用public方法,则应该使用具有相同辅助功能的补充Read方法。这是一个很好的设计(对称和预期),但是如果公共方法使用它们,那么你读或写的应隐藏在私有方法之后。

答案 1 :(得分:1)

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

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

public

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

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

答案 2 :(得分:1)

如果某个类有某些东西暴露给外界,那么将其公开为私有。它取决于课程的功能和目的,而不是当前或未来的要求。

答案 3 :(得分:1)

这是一个判断电话。一般来说,如果它在逻辑上是类所呈现的接口的一部分以获得它提供的功能,即使它没有当前用户,它也应该是公共的。这样可以减少每次想要使用它时需要修改类的机会,就像你已经使用它一样。

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

例如,考虑一个地图类。假设您目前没有任何需要知道地图中项目数量的呼叫者,并且您当前的实施具有可以轻松返回的size变量。您可以添加一个返回地图大小的getSize函数。它在逻辑上是map类公开的函数的一部分。因此,即使当前的呼叫者不需要知道大小,也可以认为它应该是公开的。

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

如果表格为空,并且您为此目的提供了isEmpty函数,则需要知道很多代码。经验表明,如果您还提供了getCount功能,则人们会getCount() == 0而不是isEmpty。这可能在今天没有任何区别,但它可能会限制您未来的实施选择,以使getCountisEmpty一样便宜。

如果可能的话,我强烈建议将其公之于众,如果您可以轻松想象该类的非破坏用户可以从访问该功能中受益,并且它构成了该类提供的功能的逻辑部分。否则,您无论如何都可以轻松添加它。所以不要过分强调它。这主要是一种风格问题,并试图预测未来。

答案 4 :(得分:0)

面向对象开发的基本原则;一个类的实例应该只暴露它的客户端需要访问的内容。请参阅link并搜索“封装”。