单一职责原则
单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因。
方块游戏设计
EG:以俄罗斯方块为例
基本逻辑
画四个方块,擦掉,让后在下一行中重新画。-> 需要画方块,擦方块的代码。
上下左右四个方向键控制方向。
如果一个类承担的职责过多,就等同于把这些职责耦合在一起,当其中一个职责发生变化的时候可能会削弱或抑制这个类完成其他职责的能力。
这种耦合会导致脆弱的设计,当变化发生时,会遭到意想不到的破坏。
软件设计真正要做的许多内容,就是发现职责并且把职责相互分离开来。
如果有多于一个的动机去改变类,那么这个类就有多余一个的职责。
在做以上俄罗斯方块程序时,应将界面与方向键的逻辑分离开来。
开放-封闭原则
开放-封闭原则(OCP[The Open-Closed Principle]):软件实体(方法,类,模块)可以扩展,不可以修改。
就是说对扩展开放,对修改关闭
无论模块多么“封闭”,都会存在一些对之无法封闭的变化。
既然不可能完全被封闭,设计人员在设计时必须对哪种变化封闭做出选择。
必须先猜测出最有可能变化的种类,再构造抽象来隔离这些变化。
面对需求,对程序的改动是添加新的代码,而不是修改原来的代码。
我们希望在工作开始不久就知道可能的变化。查明可能的变化越久,要创建正确的抽象类就越困难。
然而,对于程序中的每个部分进行抽象也不是一个好主意。拒接不成熟的抽象和抽象同样重要。
依赖倒转原则
依赖倒转原则:抽象不应该依赖细节,细节应该依赖与抽象。(要面向接口编程,而不是面向实现编程)
A:高层模块不应该依赖于底层模块。两者都应该依赖接口。
B:抽象不应该依赖细节,细节应该依赖与抽象。
什么叫做倒转?
面向过程开发时,为了复用代码,一般会将这些代码写成函数库,这样在做新的项目时,调用这些函数就可以了。
例如:项目要访问数据库,我们就把操作数据库的代码写成了函数,每次做新的项目时调用即可。这就叫做高层模块依赖于底层模块。
- 分析存在的问题:当我们要做一个新的项目时,发现高层模块的逻辑是相同的,不同的只是底层模块访问的数据库不同,这时就存在问题了,我们希望复用这些高层模块,但这些高层模块是与低层模块(访问数据库的模块)绑定在一起的,没有办法复用复用这些高层模块。
- 如果说不管哪个模块都依赖于抽象(抽象类 或 接口),只要接口是稳定的,那么任何一个变化都不会影响到其他模块。这就使得无论是哪个模块都很容易复用。
里氏代换原则
里氏代换原则(LSP):子类类型必须能够替换掉他们的父类类型。
- 为什么依赖了抽象类 或 接口就不怕更改呢?
一个软件实体如果是使用父类的话,那么一定适用于其子类,而软件实体察觉不出父类对象和子类对象的区别。
也就是说,在软件里面,把父类替换成子类,软件实体的行为没有任何变化。
正是由于子类的可替换性,所以在父类无需改动的前提下可以对程序进行扩展。
编写时都是考虑如何针对接口编程而不是针对细节编程(程序中的依赖关系都是终止于抽象类或接口)那就是面向对象编程,反之就是面向过程编程。