(3)单一职责原则
单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因。例如,我们在写一个窗体应用程序,一般都会生成一个Form这样的类,于是我们就把各种各样的代码,像算法、数据库访问SQL都写到这样的类中,这就意味着,无论何种需求要来,你都需要更改这个窗体类,维护麻烦,不能复用,缺乏灵活性。
如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其它职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。
软件设计真正要做的内容就是发现职责并把那些职责相互分离。其实要去判断是否应该分离出类来,也不难,就是如果你能够想到一个的动机去改变一个类,那么这个类具有多于一个的职责,就应该考虑将类的职责分离。
(4)开放封闭原则
开放-封闭原则,是说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。这个原则具有两个特征:①是对于扩展是开发的(Open for extension),②对于修改是封闭的(Closed for modification)[ASD]。
需求的变化,软件可以相对容易修改来适应需求的变化。
开放-封闭原则的意思是你设计的时候要尽量让这个类是足够好,写好了就不要去修改了;如果新需求来,我们增加一些类就完事了,原来的代码能不动则不动。
但绝对的对修改封闭是不可能的。无论模块是多么“封闭”,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块 对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化的种类,然后构造抽象来隔离那些变化[ASD]。等到变化发生时立即采取行动[ASD],即在 发生变化时,就及早去想办法应对更大变化的可能。
(5)依赖倒转原则(依赖倒置原则)
解释为:抽象不应该依赖细节,细节应该依赖于抽象。说白了,就是针对接口编程。不要对实现编程。具体一点就是接口或抽象类,只要接口是稳定点,那么任何一个更改都不用担心其它部分受影响,这就使得无论高层模块还是底层模块都可以很容易地被复用。
•里氏代换原则
通俗解释:一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,父类都被替换为它的子类程序的行为不会发生变化。
也正因为有了这个原则,使得继承复用成为了可能,只有当子类可以替换掉父类,软件单位的功能不会受到影响时,父类才能真正被复用,而子类能够在父类的基础上增加新的行为。由于子类的可替换性,父类才使得父类类型的模块在无需修改的情况下就可以扩展。里氏代换原则使开发封闭成为可能。
依赖倒转其实就是谁也不要依靠谁,除了约定的接口,大家都可以灵活自如。依赖倒转其实可以说是面向对象设计的标志,用哪种语言编写程序不重要, 如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计。遵循依赖倒转就是让程序都依赖抽象,而不是相互依赖。