在敏捷团队中,全局视图和软件一起演化!
- 拙劣设计的症状:
(1) 僵化性( Rigidity):设计难以改变
(2) 脆弱性( Fragility):设计容易遭到破坏
(3) 牢固性( Immobility):设计难以重用
(4) 粘滞性( Viscosity):难以做正确的事情(难以进行那些可以保持设计的修改)
(5) 不必要的复杂性( Needless Complexity):过分设计
(6) 不必要的重复( Needless Repetition):过多复制
(7) 晦涩性( Opacity):混乱的表达
- 单一职责原则( SRP : Single Responsibility Principle )
SRP :就一个类而言,应该仅有一个因其他变化的原因。
(1) 内聚性:一个模块的组成元素之间的功能相关性。此处将内聚性和引起一个模块或者类改变的作用力联系起来。
(2) 职责:变化的原因。
(3) 例子:如 Retangle类的 draw()和 area()函数,应该分离
- 开放封闭原则( OCP : Open Closed Principle )
软件实体(类、模块、函数等)应该是可扩展的,但是不可修改的。
(1) 作用:如果正确地应用 OCP,那么以后再进行同样的改动时,就只需要添加新的代码,而不必改动已经正常运行的代码。
(2) 特征:对扩展开放( Open for extension),对更改封闭( Closed for modification)。
(3) 关键:抽象。模块可以操作一个抽象体,由于模块依赖于一个固定的抽象体,所以他对于更改可以是关闭的。同时,从这个抽象体派生,也可以扩展此模块的行为。
(4) 注意:接口属于客户。
(5) 有原则的选择需要满足 OCP的实体。
- Liskov 替换原则( Liskov Subsititution Principle )
子类型( sub type )必须能够替换掉它们的基类型( base type )。
(1) 替换性质:若对每个类型 S的对象 o1,都存在一个类型 T的对象 o2,使得在所有针对 T编写的程序 P中,用 o1替换 o2后,程序 P行为功能不变,则 S是 T的子类型。
(2) 有效性:在考虑一个特定设计是否恰当时,不能完全孤立地看这个解决方案,必须要根据设计的使用者所做出的合理假设来审视它。
(3) IS-A: OOD中的 IS-A关系应该是就行为方式而言的。
(4) 契约( Contract):再重新声明派生类中的例程时,只能使用相等或者更弱的前置条件来替换原始的前置条件,只能使用相等的或者更强的后置条件来替换原始的后之条件。例如,基类输入应该是子类输入的子集,而子类输出应该是基类输出的子集。
(5) 例子: Squre和 Retangle类对于 SetHeight()方法而言,不满足 Liskov替换原则。
- 依赖倒置原则( DIP : Dependency Inversion Principle )
A. 高层模块不应该依赖于底层模块。二者都应该依赖于抽象。
B. 抽象不应该依赖于细节。细节应该依赖于抽象。
( 1)层次化设计 ( 2) DIP设计
(1) 上图不仅仅是依赖关系的倒置,也是接口所有权的倒置。底层模块实现了挂在高层模块中声明并被高层调用的接口。
(2) 程序中所有的依赖关系都终止于抽象类或接口:
· 任何变量都不应该持有一个指向具体类的指针或者引用
· 任何类都不应该从具体类继承
· 任何方法都不应该复写它的任何基类中已经实现了的方法
- 接口隔离原则( ISP : Interface Segregation Principle )
不应该强迫客户依赖于它们不用的方法 。
(1) 如果强迫客户程序依赖于那些它们不使用的方法,那么这些客户程序就面临着由于这些未使用方法的改变所带来的更改。这无意中导致所有客户程序之间的耦合。
(2) 使用委托分离接口:把对象的部分功能委托给一个 Adapter对象
(3) 使用多重继承分离接口
本文深入探讨了软件设计中的六大核心原则:单一职责原则、开放封闭原则、Liskov替换原则、依赖倒置原则、接口隔离原则,并分析了拙劣设计的典型症状。
812

被折叠的 条评论
为什么被折叠?



