为什么这么多的化石图书馆让他们的课程公开而不是最终的?

时间:2011-01-20 22:35:18

标签: java design-patterns class-design

在你以明显的答案跳过我之前,让我对问题进行限定并说,并非所有课程都是可分类的。

  • 子类化应该是经过仔细考虑的,而不是所有类的默认属性。
  • 可以说,默认情况下课程应该是最终的,如果真的想要的话,不是最终的。

我可以想到包私有类的许多优点。

  • 如果这个类不适合我的查看,只是一个帮助我应该考虑一个实现细节,使其不公开意味着当我在我的ide中按名称或接口的实现搜索类时它不会出现。 / LI>
  • 这也意味着如果除了导出的接口之外的所有内容都是公开的,那么在浏览库时,jar文件会变得更加简单,因为噪声较少。我不再看到内部实现的东西了。
  • 无需担心包裹外的子类。
  • 对于用户来说,实际的好处意味着他们需要的方法可能也会在一个接口/类下组合在一起,而不是分散在其他公共类中,这意味着更少的cluter,并且看起来更少的地方和更少的句柄太管理了。

那么为什么人们不利用这些设施?

6 个答案:

答案 0 :(得分:3)

有一些语言,例如python,其中一切都是公开的,没有什么是最终的。这并不意味着他们生活在地狱中,模块无法使用和维护。恰恰相反。

软件工程很棘手。很多时候,我们脑子里都是不知所措。这很有趣,我们追求理想,无论实际利益如何 - 如果我们有时间的话。如果你是一个负责数百个课程的人,那么作为一个完美主义者会让你发疯。

答案 1 :(得分:1)

基本上,情况会发生变化。 您认为现在不是子类,可能需要稍后进行子类化。 当你发现实际上你应该进行子类化时,很多更“蓬松”的设计选择(比如让一个类决赛​​)被认为是过度工程。

大多数API设计都考虑了可扩展性。

答案 2 :(得分:1)

就默认情况下课程是否应该是最终的而言,这是一个备受争议的观点,对此并没有真正的“正确”答案。 Java选择以一种方式实现,C#另一种方式,不同的人认为不同的语言是对错的。

就个人而言,我喜欢默认情况下类可扩展的方式,如果人们想让它们最终成为可能,那么它只是一个关键词。但是允许子类化只是在我的视图中增加了更多的灵活性,确保我不必在太阳下扩展每个非最终对象,但如果我想添加一定程度的特定行为,那么我可以选择这个选项。是的,可以使用组合(实际上应该在某些情况下使用),但这不会也不应该排除子类别作为选项。在很多情况下,子类对象满足与父母的is-a关系,在这种情况下,这是正确的方法。不可否认,虽然这在过去被滥用,但即使在Java API中(例如属性并不是真正的哈希表。)但如果你试图改变语言以阻止人们变得愚蠢 - 好吧,他们总会找到一个绕过它!

至于使类包私有,对我来说,如果包是分层的而不是平的,那么这个选项会更有用。是的,它们在描述中是分层次的,但在org.me中声明包私有的东西无法从org.me.subpackage访问,我常常觉得有必要这样做。幸运的是,通过添加超级包,我们可能会更好地使用此选项!

答案 3 :(得分:1)

  1. 我不赞成使用不支持子类的库的优势。

  2. Java没有委托,瘦子类通常用作适配器或方法拦截器。 在代码中执行它比使用反射代理更容易阅读。

  3. 事情发生了变化。可以更改的软件更易于使用。有时这会像Java 8的默认方法那样进行彻底的改进。在广泛使用接口之后,这些巧妙地修复了接口的添加方法。

答案 4 :(得分:1)

嗯,这只是因为思考什么不应该延长需要大量的脑力。

对于大多数中小型组件和框架,很好的猜测是,弃用和保持滥用/过度使用的方法/类比考虑最可能的和一些非常不可能的用例并且偶尔关闭更容易且更加用户友好然后需要一些脏的委托/装饰而不是简单的扩展。

在我的练习中,只有Java的Spring真的困扰我这种预防性的关闭(在我认为的几个微型版本之后会产生更清晰的API)。

我在这里引用了R. Martin这句话:

http://java.akraievoy.org/2009/03/openclosed-principle-strategic-closure.html

答案 5 :(得分:0)

  • 修饰符公开和最终版本来自不同的类别,如果想要明确的话,将它们放在单句中并不是一个好的开始
  • 至于最终 - 需求更改,经过一段时间后,您发现自己需要继承一些最终类,加上并非所有库/框架都可以crate代理到最终类
  • 至于包访问 - 可能会使重构变得更复杂,但是,如果你生成了一些库,不发布内部类是一个很好的“模式”