随笔分类 - 软件理论
摘要:不应该强迫客户依赖于它们不用的方法。接口隔离可以让用户端仅仅关注行为,而不是实现这种行为的对象。例如有一个功能:一个闹钟,当定时器超时的时候闹钟会响; 1 class Bell 2 { 3 void Ring() 4 { 5 6 } 7 } 8 9 class Timer10 {11 void onTimeOut(Bell b)12 {13 b.Ring();14 }15 }这里面两个问题,第一、定时器超时是一个timer类...
阅读全文
摘要:依赖倒置原则的含义高层模块不应该以来与底层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。下图的结构就违反了DIP原则,因为上层的client依赖于DB service,从而一来到DB如果DB发生了变化,就需要修改DB service,从而修改client。好的设计师中间这几层全部依赖于借口。这样就算DB发生了变化也不会对DBservice有所影响。
阅读全文
摘要:用一个子类来代替基类,程序的行为不变,那么就符合里氏替换。最常见的违反里氏替换原则的例子:子类存在空的虚函数即一个子类对于基类的某些方法进行屏蔽将其改成空函数。也成为子类的退化。里氏替换的意义在于更好的实现OCP。如果我们的子类不能完全的代替基类,那么基类的抽象就是有问题的,必然会导致,在拓展子类功能的时候需要修改基类。判断是否符合里氏替换的方法是判断两个类是否存在IS-A的关系,即子类是一个基类吗?比如说,鸭子是鸟吗?但符合IS-A的关系的对象不一定符合里氏替换。还要看对象的特性,即可能产生变化的和地方。比如说正方形是一个长方形,这个事没有问题的。 1 class Rectangle...
阅读全文
摘要:软件应该是可以扩展的,但是不可以修改的。对扩展都是开放的,模块式可以扩展来满足新的行为,我们可以改变模块的功能。OCP的好处是,尽可能的减少修改模块的次数和范围,从而提高代码的可维护性,复用性。比如操作系统的升级补丁,在修复bug的情况下,肯定是越小越小。如果说OCP做的不好,每次修改需要修改大量的文件,那就会导致补丁很大。对于修改是封闭的,在扩展模块的时候,不必改动源代码的二进制文件,不管是.o文件还是.dll文件都不用改动。问题的核心是怎么样改变了模块的功能却又不改变模块的代码呢?关键是抽象!比如说,client类会调用server的一些接口,这样就会对server产生依赖,如果想换一个s
阅读全文
摘要:首先什么是职责,在这里,职责就是变化的原因。一个类应该仅有一个引起他变化的原因。单一职责也称之为内聚性,内聚性的定义为一个模块组成元素之间的功能相关性。简单的说,单一职责就是说一个模块组成元素之间的相关性应该是很强的,或者说他们只有一种相关性。1 class Rectangle2 {3 void Draw();4 double Area();5 }在上面的代码中,长方形有两个方法,一个是绘画,一个是计算面积;这个实际上违反了单一职责,因为,画图时涉及到界面展示的部分,而面积是数学模型的计算。将两个职责分开1 class Geome...
阅读全文