在前天写的BOLG中里面讲了设计中的一些臭味, 那什么才是一个好的设计!
一个好的系统设计应该具有如下的性质:可扩展性、灵活性、可插入性。
1、可扩展性(Extensibility) 容易添加新的功能
2、灵活性(Fiexibility) 代码修改平稳地发生
3、可插入性(pluggability) 容易将一个类抽出去,同时将另一个同样接口的类加进赤!
然而要得到这样的性质就要通过面向对象设计原则去实现:
可扩展性:OCP原则,LSP原则,DIP原则,CARP原则。
灵活性: OCP原则,LoD原则,ISP原则。
可插入性:OCP原则,LSP原则,DIP原则,CARP原则。
面向对象设计原则之一-----OCP
1、“开——闭原则”(Open-Closed Principle) 简称OCP
定义:软件实体(类、模块、函数等)应该是可以扩展的,但是是不可修改的。
特征:
(1)、可扩展(对扩展是开放的)
模块的行为功能可以被扩展,在应用需求改变或需要满足新的应用需求时,我们可以让模块以不同的方式工作。
(2)、不可更改(对更改是封闭的)
这些模块的源代码是不可以改动的。任何都不许修改模块的源代码。
理解: 在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。
其实这里所说的不被修改是指的重要的抽象层的模块不会被修改,这也就是使变化中的软 系统有一定的稳定性。当系统要扩展或者添加新的行为的时候只需要添加 另外实现的模块即可。由于新添加的模块继承于抽象层,所以实现了其不变性。
比如在策略模式中,OCP就得到了很好的体现,算法的不同实现其实就是对扩展的支持,而算法抽象类是对系统的不变性的支持,环境类包装了对于环境变化的控制与所采用算法的选择,当采用其他算法的时候只需要扩展算法类即可。
也就是说关键在于抽象,抽象出来的东西是不变的,具体的实 现继承于抽象,所以保证了对修改的Close,而抽象的实现方式有多种,可以随需添加,当然这也就是对扩展的Open。 另外要求的是技术包括:多态 Polymorphism,接口 Interface,继承 Inheritance.
注:另外在对可变性进行封装的时候也应该注意以下几点:
1.识别系统有可能变化的地方。
2.不要将一种可变形散布在多处代码,而应该封装起来。
3.不要将一种可变性与另外一种可变性混在一起。