无论平台或语言如何,答案都是一样的。这个问题的关键是一个对象是否应该能够自治,或者将任何给定的行为分散在具有更集中责任的对象之间是否更好。
对于每个班级,答案可能不同。我们最终得到了一个范围,我们可以在该范围内根据责任密度放置类。
(Level of responsibility for behavior)
Autonomy - - - - - - - - - - - - - - - - - - - Dependence
High
C - <<GOD object>> <<Spaghetti code>>
l -
a -
s -
s -
-
s -
i -
z -
e - <<Template>> <<Framework>>
low
假设您喜欢让班级自己执行所有行为,或者尽可能多地执行。从该图的左侧开始,当您使您的类更加自治时,除非您不断地重构它以使其更通用,否则类的大小将会增长。这导致一个模板。如果不进行重构,则倾向于使该类变得更加“神一样”,因为如果它需要某些行为,它就有一种方法。领域和方法的数量不断增长,很快就变得难以管理和不可避免。由于该课程已经做了很多工作,因此编码人员宁愿增加这个怪物,也不愿尝试将其拆散并切断 Gordian 结。
图的右侧有在很大程度上依赖于其他类的类。如果依赖级别高但单个类很小,那就是框架的标志;每个类都做的不多,需要很多依赖的类来完成一些功能。另一方面,高度依赖的类也有大量的代码,这表明该类充满了Spaghetti。
这个问题的关键是确定你在图表上感觉更舒服的地方。无论如何,除非应用了一些组织原则,否则单个类最终会散布在图表上,这就是您如何实现Template或Framework的结果。
刚刚写完,我想说班级规模和组织程度之间存在相关性。Robert C. Martin(或“Uncle Bob”)在他关于设计原则和设计模式的非常详尽的论文中涵盖了类似的包依赖关系。 JDepend是第 26 页图表背后思想的实现,并补充了静态分析工具,例如Checkstyle和PMD。