二、
敏捷开发的设计原则
ITPUB个人空间FDa k2q1ng?']@ITPUB个人空间UI.n%d2d关于敏捷开发的设计原则:
E
\Y8lJd{H0单一职责原则SRP:Single Responsibility Principle
*~4Atw-s1_e0开放封闭原则OCP:Open-Close Principle
~/b1m7OW.E4x0Liskov替换原则LSP:Liskov Substitution Principle
ITPUB个人空间"tUT!^2]"tF依赖倒置原则DIP:Dependency Invertion Principle
ITPUB个人空间1z5w0QH;]N接口隔离原则ISP:Interface Separate Principle
ITPUB个人空间"~:L5N D][2L8nB%c关于包的设计原则:
ITPUB个人空间C!V1h6nef`重用发布等价原则REP:Reuse Equivalence Principle
u+z0Gbs)p0共同重用原则CRP:Common Resue Principle
ITPUB个人空间_tP$p'c(H`Vp共同封闭原则CCP:Common Close Principle
/b'X"x%q)L0无环依赖原则ADP:Acyclic Dependency Principle
ITPUB个人空间yu6IJ9h
~稳定依赖原则SDP:Stabilization Dependency Principle
ITPUB个人空间0Iz+T+M3wvfg稳定性度量公式:I=Ce/(Ca+Ce) (I:不稳定度,Ce:输入耦合度,Ca:输出耦合度)
ITPUB个人空间5D
W&{,_5G2@8[,eI取值范围在【0,1】,I=0表示具有最大稳定度;iI=1标识具有最大不稳定度
ITPUB个人空间6aY'O6[*Y"E8H(s4C(l稳定抽象原则SAP:Stabilization Abstract Principle
$M$gjac'Wds0;C S(ZIVlfu0 ITPUB个人空间SE)w|wM+QLITPUB个人空间ZB |+u;OrGOF说--基于对象组合的设计会有更多的对象(而有较少的类)。
ITPUB个人空间0hP{*f(t1xd如果单纯的看这里,你会明白似乎类较少符合面向对象的逻辑。
3`g6Ccl,B8]8v0但是且慢,我们知道面向对象有一条原则叫单一职责原则--SRP。
ITPUB个人空间4qgsvLI这样好像类多又是面向对象思想的体现。
ITPUB个人空间Iu0XxB0|c$DY9zA其实最重要的是GOF中的这句话--且系统的行为将依赖对象间的关系而不是被定义在某个类中。
myB2?#@8C+B0所以类的多少并不是问题的关键,是否职责单一也不是大问题,
ITPUB个人空间"M1h _)w4`0uc~最重要的是你现在的那些职责是都多少是不能被别的职责通过某种方式所代替的。
ITPUB个人空间/s'MO$},M.z在BOB大叔那里定义职责是变化的原因,因此就可以认为这些变化的原因应该是不可代替的,
ITPUB个人空间#N+yjl6i也可以说你不能由这个原因推导出别的原因。
;LC2{&ty3B0只要这个原因间可以做到相互关联,那么你就可以把由于这些变化而引起变化的类组合起来,
#j:XY6vX0而不是把他们规定在新的类中。
f`9E(K?,\C0ITPUB个人空间&q&I.d4i;|[`R OITPUB个人空间l
kF1Fi`qm开放封闭原则OCP:Open-Close Principle
ITPUB个人空间
@|+ua9t2KWUITPUB个人空间_@!G"~2x?$ZT一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。
ITPUB个人空间6H\4Sb;[q'^ITPUB个人空间'i+WkC)?Aa{因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态
技术。
KM3AA[Or0y%wm!_4i'o/y0该原则同样适合于非面向对象设计的方法,是软件工程设计方法的重要原则之一。
'F2JrOB0}:A;b"g_c0我们以收音机的例子为例,讲述面向对象的开闭原则。
-n!I X2e(_%Tx0ITPUB个人空间_8p%g{0R
[0Y我们收听节目时需要打开收音机电源,对准电台频率和进行音量调节。
ITPUB个人空间ms1Pp8o"?8z!V9[4U_z1fMX Tk+?xzM0但是对于不同的收音机,实现这三个步骤的细节往往有所不同。
5V*lE!ODG%C
m0ITPUB个人空间u2Fjiu比如自动收缩电台的收音机和按钮式收缩在操作细节上并不相同。
2QG3ft6b/pMZd08P,d @k7~0因此,我们不太可能针对每种不同类型的收音机通过一个收音机类来实现(通过重载)这些不同的操作方式。
j7B%L8hB^w0ITPUB个人空间l4\
~\C\*Z但是我们可以定义一个收音机接口,提供开机、关机、增加频率、降低频率、增加音量、降低音量六个抽象方法。
ITPUB个人空间 wco:v
d"D&PY(}C{ lJ!RC gV(@0不同的收音机继承并实现这六个抽象方法。
ITPUB个人空间c{@(U5Y\F^E){ _r{ dkS0这样新增收音机类型不会影响其它原有的收音机类型,收音机类型扩展极为方便。
:o!yqq*F0ITPUB个人空间Kl9JL|Os1p此外,已存在的收音机类型在修改其操作方法时也不会影响到其它类型的收音机。
p#^UkG:l!L!P0图1是一个应用OCP生成的收音机类图的例子:
vY;Dy9A0ITPUB个人空间([q`0c;t|wY$m3|Liskov替换原则LSP:Liskov Substitution Principle
Vtk`s g5b0@0r_Wr8x
c2n0子类应当可以替换父类并出现在父类能够出现的任何地方。
ITPUB个人空间 GlOL3c-]+sV7D? pzw*rXB.t`z%s0我们以学生为例,夜校生为学生的子类,因此在任何学生可以出现的地方,夜校生均可出现。
U5E}'m&O/XK0ITPUB个人空间v
J+Q:~z这个例子有些牵强,
ITPUB个人空间 NdLw'S&wO(lQ t;dPj%?0一个能够反映这个原则的例子时圆和椭圆,圆是椭圆的一个特殊子类。
ITPUB个人空间B#u4pC'UNo PSs,lp0u$[1axV4sP I0因此任何出现椭圆的地方,圆均可以出现。但反过来就可能行不通。
2N0EG:La4Z7w:j#X3oG%[0