何时应该将方法设为私有?

时间:2010-04-20 16:17:56

标签: oop

很多时候,我不确定某个特定方法是否应该是私有的。例如,我正在建立一个班级,负责生成报告。这个类有一个buildReport方法和几个收集buildReport必要数据的方法。

// single public method
// uses a set of helper methods
public buildReport()

// helper methods
private avgSurveyTime()
private fetchVendors()
private fetchSendCounts()
private ...

我在争论是否应该公开这些辅助方法。我此刻打算在外面打电话的唯一方法是buildReport()。但是,仅使用fetchVendors()等来获取供应商列表可能很有用。

我看到两种思想流派:你总能尽可能少地暴露出来。 (在这种情况下,我的许多类只有一个公共方法)或者您可以公开所有可能对该类用户有用的内容。

是否有一个很好的经验法则可用于决定何时应将方法设为公共/私人?

12 个答案:

答案 0 :(得分:94)

我遵循的唯一规则是尽量少公开。

以这种方式看待它。你可以随时公开一些东西 - 它不会破坏任何现有的代码。试图制作公开的私人内容最终可能会破坏许多现有代码。

如果有人想从您的班级获得更多功能,那么他们可以提出请求,您可以公开他们需要的内容。有可能他们想要的东西与你已经拥有的东西略有不同,所以你需要一个新的界面。

答案 1 :(得分:16)

一个有用的指导技巧是在开始实现之前为您的类编写一个接口。然后在实现时,告诉自己不在接口中的方法应该是私有的,或者根本不在该类中。

如果您在设计类的合同时不知道需要的方法,那么它可能不应该是其公共接口的一部分。

答案 2 :(得分:9)

  1. 你应该只向外界揭示外界真正需要的东西。通常最好在需要时为类消费者添加功能,而不是最初。如今,智慧是避免预工程。 (see YAGNI

  2. 拥有类中其他功能所使用的公共方法当然可以接受。但是,这应该被视为次要bad smell 可能表明您的班级正在尝试做太多事情。

  3. 我的猜测是让你的课程保持原样。然后,当外界需要这些其他更小的方法时,请考虑是否应该分类。如果每个类的目的是生成一个报告,那么您不应该从这个对象公开这些方法。相反,将“较小”方法放入公共帮助程序类中。这样,外部世界可以使用它们,而不会从根本上改变现有报告类的性质。简而言之:

    不要只是因为您认为以后可能会有所帮助。如果/当需要其他功能时,请重新考虑您的整体设计以适应新的要求。

答案 3 :(得分:4)

公共和私人方法是非常不同的野兽。在公开方法之前要小心。

  • 公共方法必须验证其所有参数。
  • 必须妥善记录它们,包括它们可能抛出的任何异常。
  • 必须分析所有边缘情况并使用(在代码或文档中)删除。
  • 涉及调用公共方法的顺序的任何要求必须记录在案,或者最好删除。
  • 还必须记录和验证对象状态要求。
  • 在从一个版本移动到另一个版本时,公共方法不得以任何可能破坏应用程序的方式更改其签名或行为。
  • 可能需要使用编组要求设计公共方法。 (例如.Net的CLS限制。)

私人方法没有这些限制。

答案 4 :(得分:3)

如果在课堂之外不需要它,那就是在那个时刻,让它变成私密的。如果以后,您可以根据需要对其进行保护或公开。

如有疑问 - 请将其设为私有。

答案 5 :(得分:3)

如果该课程是供您组织内部使用的,即您不将其作为一般用途图书馆分发,那么我衷心同意您应尽可能多地私有或受到保护。如果稍后您发现某些其他类需要访问私有函数,那么很好,此时将其更改为public。这不难做到。

我唯一需要注意的是,如果这是你正在“发布”的东西,那些没有直接线路来进行更改的人将使用它。然后你需要仔细考虑一个完整的API。

但如果不这样做,只需编写您需要的代码即可。不要编写您认为有一天可能会使用的函数。

答案 6 :(得分:2)

一般情况下,您应该尽可能少地展示并尽可能保密。

如果你犯了一个错误并隐藏了你应该暴露的东西,没问题,只需公开。但是,如果你把某些东西公开然后决定它应该是私有的,那么你可能会遇到问题,因为现在许多其他类都可以使用公共方法。

您可以自由更改私有方法的实现,而不会产生任何外部影响。如果您拥有所有公共类,则可能无法实现,因为这些方法可能会被类外的某些方法使用。

答案 7 :(得分:2)

我总是遵循这个:“明天的设计,今天的代码。

如果今天你只需要一种公共方法,那么只保留一种公共方法。

答案 8 :(得分:1)

规则是除非需要,否则应提供方法。其中一个主要原因是,在API等的未来版本中,您总是可以公开私有函数,但是在不破坏现有代码的情况下,您几乎不能将以前的公共函数设置为私有。

答案 9 :(得分:0)

未包含在类接口中的所有内容都应该(必须,真的)是私有的。如果您不确定类的接口是什么(即,您不是http://www.artima.com/lejava/articles/designprinciples.html>programming到接口或那些接口尚未完全定义,请启动所有私有,并根据需要将内容公开,受保护,打包私密等。

但仔细想想!一旦其他代码可以访问某些内容,该代码与此类之间就存在依赖关系,并且重构受到限制。经验法则:只展示那些定义抽象的方法,而不是它是如何实现的。

答案 10 :(得分:0)

简单的规则:

  1. 如果您不打算公开它 在正在使用的类之外 它,使其私人

  2. 如果您想曝光它 在同一个组件内部到另一个 课程但不在课外 组装,使它内部(C#) / 朋友(VB.NET)。

  3. 如果您想曝光 程序集外的功能 给每个人,让它 PUBLIC

答案 11 :(得分:0)

我正在研究一个主要由两件事组成的系统:从各种来源导入数据,以及生成报告。问题是整个事情是由缺乏基本OO设计技能的人设计的。在同一个“类”中,他们将使用“私有”方法从数据库中读取数据,调用“私有”方法来验证所述数据,这也是由另一个“私有”500行函数调用的,这些函数或多或少地在简单地格式化所述数据的整个应用程序。

你应该离开私人avgSurveyTime() private fetchVendors() private fetchSendCounts() 来自处理页面布局的实际类。