《敏捷软件开发》学习 笔记:敏捷设计原则
2011-2-15
什么是敏捷设计
遵循敏捷实践去发现问 题;应用设计原则去诊断问题;应用适当的设计模式去解决问题。
软件开发这三个方面件 的相互作用就是设计。
单一职责原则 SRP
就一个类而言,应该仅 有一个引起它变化的原因。
把职责定义为“变化的 原因”。如果有多于一个动机去改变一个类,这个类就具有多于一个的职责。
开放封闭原则 OCP
描述:软件实体应该是 可以扩展的,但是不可修改的。
OCP 是面向对象设计的核 心所在。
实现这个原则的关键是 抽象。
模块依赖于一个固定的 抽象体,它对于更改是关闭的。通过从这个抽象体派生,可以扩展此模块的行为。
首先判断出可能发生的 变化,然后构造抽象隔离这些变化。
抽象不能滥用,应该仅 仅对频繁变化的那些部分做出抽象。
Liskov替换原则
原则描述
LSP:子类型 (subtype)必须能够替换它们的基类型 (base type)。
OCP 是 OOD 中很多说法的核心。 LSP 是使 OCP成为可 能的主要原则之一。
子类型的可替换性,使得使用基类类型的模块在无需修改的情况下就可以扩展。
可替换性并非可以轻易获得,依赖于客户的合理假设
IS-A的含义过于宽泛,不能用来判断可替换性。 IS-A关系是就行为方式而言的,行为方式是可以 进行合理假设的,是客户程序所依赖的。
一个模型,如果孤立的看,并不具有真正意义上的有效性。模型的有效性只能通过它的客户程序来表现。必须根据使用者 的合理假设进行审视。
基于契约的编程,可以使合理的假设明确化
契约是通过为每个方法声明的前置条件和后置条件来制定的。
可替换性要求:子类型的前置条件不能更强,后置条件不能更弱。
修改设计,符合 LSP
如果 IS-A关系不能符合 LSP,需要进行设计的修改:提取公共部分作为基类。
违反 LSP 的用法
派生类中的退化函数;
从派生类中抛出异常;
依赖倒置原则 DIP
高层模块不应该依赖于 底层模块。二者都应该依赖于抽象。
抽象不应该依赖于细 节。细节依赖于抽象。
倒置的含义:底层反而 依赖于在高层中声明的抽象服务接口。接口的所有权属于高层。这和传统的过程化程序设计所创建出来的依赖关系结构相反。
依赖于抽象: 程序中所有的依赖都应该终止于抽象类或者接口。把不稳定隐藏在抽象后面,隔离变化。
接口隔离原则 ISP
不应该强迫客户依赖与 它们不用的方法。
设计中需要避免 fat class。
如果客户程序是分离 的,接口也应该保持分离。否则,不同客户之间会产生依赖。
存在的约束:有时出于 实现的需要,一些无关的接口必须放在一个对象中。
解决:通过委托、或者 通过该对象的基类去访问。类似于 Adapter 模式。