首先,我要说的是我在这里主要讨论方法访问,而在较小程度上,将类标记为最终访问,而不是成员访问。
老智慧
“将其标记为私人,除非您有充分的理由不这样做”
在开放源代码主导开发人员库空间和VCS /依赖关系mgmt之前的几天里,它就很有意义。在Github,Maven等的帮助下成为超级协作。那时,通过限制图书馆的利用方式也可以赚钱。我可能在职业生涯的前8到9年中严格遵循了这种“最佳实践”。
今天,我认为这是个坏建议。有时有一个合理的论据将一个方法标记为私有,或将一个类标记为final,但这种情况极为罕见,即使那样也可能没有任何改善。
你有没有:
- 被库等感到失望,惊讶或伤害,该库具有可以通过继承和少量代码修复的错误,但是由于私有/最终方法和类被迫等待可能永远不会出现的正式补丁?我有。
- 是否希望将库用于与作者想象的稍有不同的用例,但由于私有/最终方法和类而无法使用?我有。
- 是否对库的可扩展性过于宽容感到失望,惊讶或伤害?我还没有。
这是我听说过的默认情况下将方法标记为私有的三个最大的合理化方法:
合理化1:这是不安全的,没有理由要覆盖特定的方法
我无法数出是否有必要重写我编写的特定方法的错误次数。在研究了几个流行的开源库之后,我很难理解将内容标记为私有的真实成本。它通常消除了针对不可预见的问题或用例的唯一实际解决方案。相反,由于API安全相关的原因,我从未有超过16年的专业发展后悔将方法标记为保护而非私有。当开发人员选择扩展类并覆盖方法时,他们会自觉地说“我知道我在做什么”。为了提高生产力,应该足够了。期。如果很危险,请在类/方法Javadocs中加以注意,不要盲目地关上门。
默认受保护的标记方法可以缓解现代软件开发中的主要问题之一:想象力的失败。
合理化2:保持公共API / Javadocs的清洁
这是更合理的做法,并且取决于目标受众,这甚至可能是正确的选择,但是值得考虑的是保持API“干净”的代价实际上是:可扩展性。出于上述原因,为防万一,标记默认情况下受保护的内容可能更有意义。
合理化3:我的软件是商业软件,我需要限制其使用。
这也是合理的,但是作为消费者,我每次都会选择限制性较小的竞争对手(假设不存在明显的质量差异)。
永远不要把话说绝了
我并不是说永远不要将方法标记为私有。我说的更好的经验法则是“除非有充分的理由不这么做,否则使方法受到保护”。
该建议最适合那些正在分解成模块的图书馆或大型项目的人员。对于更小或更单一的项目,这无关紧要,因为您始终控制所有代码,并且在需要时很容易更改代码的访问级别。即使那样,我仍然会给出相同的建议:-)