《敏捷软件开发 ——原则、模式、与实践》学习笔记(2)

本文深入探讨了软件设计中的六大核心原则:单一职责原则、开放封闭原则、Liskov替换原则、依赖倒置原则、接口隔离原则,并分析了拙劣设计的典型症状。

 

在敏捷团队中,全局视图和软件一起演化!

 

  1. 拙劣设计的症状:

(1)    僵化性( Rigidity):设计难以改变

(2)    脆弱性( Fragility):设计容易遭到破坏

(3)    牢固性( Immobility):设计难以重用

(4)    粘滞性( Viscosity):难以做正确的事情(难以进行那些可以保持设计的修改)

(5)    不必要的复杂性( Needless Complexity):过分设计

(6)    不必要的重复( Needless Repetition):过多复制

(7)    晦涩性( Opacity):混乱的表达

 

  1. 单一职责原则( SRP Single Responsibility Principle

 

SRP :就一个类而言,应该仅有一个因其他变化的原因。

 

(1)    内聚性:一个模块的组成元素之间的功能相关性。此处将内聚性和引起一个模块或者类改变的作用力联系起来。

(2)    职责:变化的原因。

(3)    例子:如 Retangle类的 draw()和 area()函数,应该分离

 

  1. 开放封闭原则( OCP Open Closed Principle

 

软件实体(类、模块、函数等)应该是可扩展的,但是不可修改的。

     

(1)    作用:如果正确地应用 OCP,那么以后再进行同样的改动时,就只需要添加新的代码,而不必改动已经正常运行的代码。

(2)    特征:对扩展开放( Open for extension),对更改封闭( Closed for modification)。

(3)    关键:抽象。模块可以操作一个抽象体,由于模块依赖于一个固定的抽象体,所以他对于更改可以是关闭的。同时,从这个抽象体派生,也可以扩展此模块的行为。

(4)    注意:接口属于客户。

(5)    有原则的选择需要满足 OCP的实体。

 

 

  1. 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替换原则。

 

  1. 依赖倒置原则( DIP Dependency Inversion Principle

 

A. 高层模块不应该依赖于底层模块。二者都应该依赖于抽象。

B. 抽象不应该依赖于细节。细节应该依赖于抽象。

 

    
   
 
 

 

 

 

 

 

 

 

 

 

 

 

 

            1)层次化设计                                          2 DIP设计

 

(1)    上图不仅仅是依赖关系的倒置,也是接口所有权的倒置。底层模块实现了挂在高层模块中声明并被高层调用的接口。

(2)    程序中所有的依赖关系都终止于抽象类或接口:

·        任何变量都不应该持有一个指向具体类的指针或者引用

·        任何类都不应该从具体类继承

·        任何方法都不应该复写它的任何基类中已经实现了的方法

 

  1. 接口隔离原则( ISP Interface Segregation Principle

 

不应该强迫客户依赖于它们不用的方法

 

(1)    如果强迫客户程序依赖于那些它们不使用的方法,那么这些客户程序就面临着由于这些未使用方法的改变所带来的更改。这无意中导致所有客户程序之间的耦合。

(2)    使用委托分离接口:把对象的部分功能委托给一个 Adapter对象

(3)    使用多重继承分离接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值