在你以明显的答案跳过我之前,让我对问题进行限定并说,并非所有课程都是可分类的。
我可以想到包私有类的许多优点。
那么为什么人们不利用这些设施?
答案 0 :(得分:3)
有一些语言,例如python,其中一切都是公开的,没有什么是最终的。这并不意味着他们生活在地狱中,模块无法使用和维护。恰恰相反。
软件工程很棘手。很多时候,我们脑子里都是不知所措。这很有趣,我们追求理想,无论实际利益如何 - 如果我们有时间的话。如果你是一个负责数百个课程的人,那么作为一个完美主义者会让你发疯。
答案 1 :(得分:1)
基本上,情况会发生变化。 您认为现在不是子类,可能需要稍后进行子类化。 当你发现实际上你应该进行子类化时,很多更“蓬松”的设计选择(比如让一个类决赛)被认为是过度工程。
大多数API设计都考虑了可扩展性。
答案 2 :(得分:1)
就默认情况下课程是否应该是最终的而言,这是一个备受争议的观点,对此并没有真正的“正确”答案。 Java选择以一种方式实现,C#另一种方式,不同的人认为不同的语言是对错的。
就个人而言,我喜欢默认情况下类可扩展的方式,如果人们想让它们最终成为可能,那么它只是一个关键词。但是允许子类化只是在我的视图中增加了更多的灵活性,确保我不必在太阳下扩展每个非最终对象,但如果我想添加一定程度的特定行为,那么我可以选择这个选项。是的,可以使用组合(实际上应该在某些情况下使用),但这不会也不应该排除子类别作为选项。在很多情况下,子类对象满足与父母的is-a关系,在这种情况下,这是正确的方法。不可否认,虽然这在过去被滥用,但即使在Java API中(例如属性并不是真正的哈希表。)但如果你试图改变语言以阻止人们变得愚蠢 - 好吧,他们总会找到一个绕过它!
至于使类包私有,对我来说,如果包是分层的而不是平的,那么这个选项会更有用。是的,它们在描述中是分层次的,但在org.me中声明包私有的东西无法从org.me.subpackage访问,我常常觉得有必要这样做。幸运的是,通过添加超级包,我们可能会更好地使用此选项!
答案 3 :(得分:1)
我不赞成使用不支持子类的库的优势。
Java没有委托,瘦子类通常用作适配器或方法拦截器。 在代码中执行它比使用反射代理更容易阅读。
答案 4 :(得分:1)
嗯,这只是因为思考什么不应该延长需要大量的脑力。
对于大多数中小型组件和框架,很好的猜测是,弃用和保持滥用/过度使用的方法/类比考虑最可能的和一些非常不可能的用例并且偶尔关闭更容易且更加用户友好然后需要一些脏的委托/装饰而不是简单的扩展。
在我的练习中,只有Java的Spring真的困扰我这种预防性的关闭(在我认为的几个微型版本之后会产生更清晰的API)。
我在这里引用了R. Martin这句话:
http://java.akraievoy.org/2009/03/openclosed-principle-strategic-closure.html
答案 5 :(得分:0)