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

Aar*_*Szy 43 oop

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

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

// helper methods
private avgSurveyTime()
private fetchVendors()
private fetchSendCounts()
private ...
Run Code Online (Sandbox Code Playgroud)

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

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

是否有一个很好的经验法则用于决定何时应该公开/私有方法?

Chr*_*isF 94

我遵循的唯一规则是尽可能少公开.

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

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

  • +1,有一个额外的点 - 如果你要公开一些私密的东西,你需要考虑为什么,并看看是否可能访问这个方法的东西应该委托给该类更多的责任,所以它不会首先需要私有方法.私有方法通常是管道代码,如果您正在寻找管道,那么您就不在自己的元素中了. (8认同)

Ben*_*mes 16

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

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


Pat*_*her 9

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

  2. 拥有公共方法也可以接受,这些公共方法也被类中的其他功能所使用.但是,这应该被认为是一种轻微的难闻气味.这可能表明你的班级正在尝试做太多事情.

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

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


Jef*_*dge 6

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

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

私有方法没有这些限制。