一个类,只有一个引起它变化的原因,应该只有一个职责。
单一职责原则提出一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类设计是否优良,但“职责”和“变化原因”都是不可度量的,因项目而异,因环境而异。
单一职责原则的优点:
所有引用基类的地方必须能透明地使用其子类对象,反之则不行。
在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了LSP原则;如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中发生“畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系替代继承。
在设计模式中体现里氏替换原则的模式如下:
高层模块不应该依赖低层模块,两者都应依赖其抽象,抽象不依赖细节,而细节依赖抽象。
模块间的依赖通过抽象产生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生,接口或抽象类不依赖于实现类,实现类依赖接口或抽象类。
结合里氏替换原则使用。里氏替换原则指出父类出现的地方子类就可以出现,结合依赖倒置原则可以得出一个通俗的规则:接口负责定义抽象方法,并且声明与其他对象的依赖关系,抽象类负责公共构造部分的实现,实现类准确地实现业务逻辑,同时在适当的时候对父类进行细化。
一个类对另外一个类的依赖性应当是建立在最小的接口上,使用多个专门的接口比使用单一的总接口要好。
接口隔离原则和其他的设计原则一样,都是需要花费时间和精力来进行设计和筹划的,但是它带来了设计的灵活性,并降低整个项目的风险,当业务变化时能够快速应付。在设计接口时应根据经验和常识决定接口的粒度大小,如果接口粒度太小,导致接口数量剧增,给开发带来难度;如果接口粒度太大,灵活性降低,无法提供定制服务,给项目带来无法预计的风险。
一个对象应该对其他对象有最少的了解,即一个类应该对自己需要耦合或者调用的类知道得最少。
在设计模式中体现迪米特法则的模式如下:
一个软件实体,如类、模块和函数应该对外扩展开放,对修改关闭。
开闭原则是面向对象设计的终极目标,其他设计原则都可以看做是开闭原则的实现方法。
开闭原则的重要性体现在以下几个方面: