原创 | 类应该是匀称和均匀的
当我们采用面向对象的编程语言来设计类的时候,我们设计的大部分类应该是匀称并且均匀的。
类本身应该是匀称的
我们知道,类既有状态,又有行为。在多数面向对象的语言中,状态由类的字段来承载,而行为通过类的方法来实现。通过方法调用可以改变类的内部状态,而类的内部状态又可以影响方法的调用结果。
类应该是匀称的,在一个类的内部,它的字段数量和方法数量之间应该维持一个合适的比例。只有字段没有方法的类和只有方法没有字段的类都不应该存在,或只有少量存在。类既不应该太瘦高,也不应该太矮胖。理想状态下,一个类中的每个方法都应该用到这个类的所有或者大多数字段,否则这个类就明显缺乏内聚性,应该拆分为两个或多个类。
只有字段没有方法的类的典型例子就是贫血模型中的领域类。它们上面没有定义任何有意义的方法,只有getter和setter这样的状态封装器,严格来说不属于方法。这样的类只是披着类的外衣的数据结构。
只有方法没有字段(或只有极少字段)的类的典型例子是各种门面(Facade)类,以及DateUtils、CollectionUtils这样的工具类。这样的类里面的方法明显缺乏内聚性。
只有状态的类和只有方法的类都违反了面向对象的基本原则。在面向对象的范式中,类是状态和行为的统一。虽然在函数式编程范式中,数据和行为分离是得到鼓励的,但是既然我们仍然采用OO编程范式,就应该继续遵循OO的原则。
项目中的类应该是均匀的
项目中的类应该是均匀的。各个类的规模应该相差不大,复杂度相当,担任有限数量的职责。避免出现成千上万行代码的上帝类和大量只有几行代码的尘埃类。
上帝类存在于很多设计不良的项目中。我曾经参与过的一个遗留项目,发现其中有一个类占了整个项目代码行数的三分之一以上!系统每次扩展都要修改这个类,往上面添砖加瓦。这个类达到了“全知”(了解和调用所有底层组件)、“全能”(参与实现系统的全部功能)的程度,称为“上帝类”当之无愧。可惜它无法达到“全善”,实际上它是万恶之源。
系统中所有的类都应该只承担有限数量的职责,各个类的大小应该相差不大。高层的类只负责协调底层的多个类完成一个高阶功能而不是亲自实现所有细节,每个低层类应该只实现高层类委托的一个子任务。高层类和低层类的责任都是有限的。
现实生活中不也是这样吗?部长和科员级别相差很大,但是两者的工作量不会有数量级的差别。上天给每个人都是每日24小时,“日理万机”是不可能的。部长负责工作的分解和整合,工作任务层层分解和分派下去,每个科员则负责实现工作的一小部分。我们不需要选取一个巨人或神仙来担任部长。
类本身应该是匀称的,类之间应该是均匀的。不符合这个原则的项目必然存在不同程度的设计欠账,将来也许需要偿还高额的利息——如果它还有将来的话。
版权声明: 本文为 InfoQ 作者【编程道与术】的原创文章。
原文链接:【http://xie.infoq.cn/article/f5358af7a1b39c6a2e61145ed】。文章转载请联系作者。
评论 (2 条评论)