【我的《冒号课堂》学习笔记】设计原则(4)保变原则
保变原则
保变(Protected Variaitions)原则:保变是指受保护的变化。原则内容是找出预计的变化点或不稳定点,分配其职责以便用稳定的接口来包装。
保变原则和单职原则一直,中心都是职责与变化。不过从名称上就能看出,保变原则的着眼点更倾向变化,而单职原则的着眼点更倾向职责,此外前者侧重解决耦合问题,后者侧重解决内聚问题。封装就是实现PV的一种技巧与手段。PV涵盖的范围很广,可以是任何软件实体,包括模块、组件、子系统乃至系统。封装是在类级别的PV,或者说是数据抽象层的PV。同理,子类型多态是接口级别的PV,或者说是多态抽象层的PV。
保变原则与经典的开闭原则非常神似,如果非要找出它们之间的区别不可的话,保变原则提倡变中求稳,更侧重可维护性;开闭原则提倡稳中求变,更侧重可重用性。保变原则还暗含了迪米特法则(Law of Demeter,简称LoD),又称最少知识原则(Least Knowledge Principle,简称LKP)。具体应用到方法调用上,它要求一个对象的方法只能调用以下对象:该对象本身,即this(或self);该方法的参数;该方法内部创建的对象;该对象的直接组成对象,包括其属性及属性中的元素。
GRASP(General Responsibility Assignment Software Patterns/Principle),即通用职责分配原则。合理的系统应保证每个模块各司其职、各尽其责,既不尸位素餐,也不越俎代庖。但具体如何分配职责更合理呢?GRASP给出了一套参考答案。
信息专家原则可简单地归结为:知情者为负责者,既谁拥有完成职责所需的全部信息,谁就该负责。知情者太多是设计可能有缺陷的征兆。如果确实无法免除,就选与职责关联度最大的那位知情者。知情者具备了承担职责的基本能力,于相关信息也有一定的内在联系,让它来负责既是可能的,也是合理的。这样可令系统的整体功能比较均匀地分散于各个类之中。每当变化来临,由于职责分工明确而公平,相关的承担者容易被识破并且范围有限,同时职责分量也不会太大,因而系统较易维护。
信息专家原则有一定的合理性,但它多少还是会增加系统的耦合。当增加的耦合明显阻碍了系统的可维护性或可重用性,就须要求纯虚构原则了。比如,创建者原则建议:创建一个类的实例的职责应分配给那些包含、聚合、记录或密切使用该类的类,或者拥有该类初始化数据的类。这个原则非常自然,算得上是信息专家原则的一个推理,但同时也在两个类之间建立了强耦合。因此,可以专门设计一个工厂类,接管创建对象的职责——这便是著名的工厂模式。该工厂类无疑符合纯虚构原则,因为工厂原本是不存在的。
SOLID,它们是5个OOD原则的首字母缩写,都是熟面孔了,不用再加介绍。
SOLID是类级别的设计原则,而这个是包级别的设计原则。此处是的包指的是一组相关的类组成的颗粒度更大的模块。
总结: