面向对象的设计原则

面向对象的设计原则
By SmartPtr( http://www.cppblog.com/SmartPtr/)

面向对象的设计原则

1 软件设计中存在的问题

1)过于僵硬(Rigidity):很难加入新功能
2)过于脆弱(Fragility):很难修改
3)复用率低(Immobility):高层模块无法复用
4)黏度过高(Viscosity): 破坏原始框架的设计

2 好的设计的目标

1)可扩展性(Extensibility):容易添加新的功能而不影响已有模块
2)灵活性(Flexibility):代码修改平稳地发生,一处修改不影响另一处
3)可插入性(Pluggability):容易将一个类抽出去,同时将另一个有同样接口地类加入进来, 而不想象类的使用者

3 面向对象的设计原则

1)“开-闭”原则(The Open-Closed Principle):对可变性地封装
* Open for extension, closed for modification
* 通过增加代码来变化, 而不是更改现有代码来变化
* 封装可变性, 抽象出抽象体,此抽象体不可更改,但可以通过派生抽象体来扩展功能。


2)里氏替换原则(The Liskov Substitution Principle):如何进行继承
* 若用类S对象替换类T对象后程序的功能不变,则S是T的子类型
* OOD中的Is-A关系是就行为功能而非内在关系而言, 其继承概念与通常的数学法则和生活常识是不同范畴的事物, 有不可混淆的区别
* 在任何父类出现的地方都可以用它的子类来替代

3)依赖倒置原则(Dependence Inversion Principle):针对接口编程
* 高层模块不应该依赖于低层模块。二者都应该依赖于抽象。
* 抽象不应该依赖于细节,细节应该依赖于抽象。
* 类之间的耦合关系:零耦合(Nil Coupling),具体耦合(Concrete Coupling),抽象耦合(Abstract Coupling)
* 从问题的具体细节中分离出抽象,以抽象方式对类进行耦合。
* 但会导致产生大量的类

4)接口隔离原则(Interface Segregation Principle) 恰当地划分角色和接口
* 从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小的接口上的。使用多个专门的接口比使用单一的总结口要好。


5)合成/聚合复用原则(Composite/Aggregate Reuse Principle):尽量使用合成/聚合而不使用继承
* 聚合: 表示拥有或整体与部分的关系。UML中意为shared(Aggregate), 用空心菱形表示
* 合成:更强的聚合关系。整体负责部分的生命周期,整体和部分是不可分的,部分是不能被共享的。比如孙悟空 ,他的四肢, 和他的武器。悟空和四肢的关系就是合成,而和武器之间的关系就是聚合。UML中意为composite, 用实心菱形表示
* 在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用这些对象的目的。
* 继承优点:新的实现较为容易; 比较容易添加到已有系统中
  继承缺点:破坏封装; 很难处理超类的变化; 继承的实现是静态的
* 聚合优点:支持封装; 支持包装; 复用可以动态进行
  聚合缺点: 不易扩展已有系统; 需要较多的对象管理

6)最少知识法则(Law of Demeter): 不要和陌生人说话
* 只和你直接的朋友们通信,不要和"陌生人"说话
* 一个对象应当对其他对象有尽可能少的了解
* 其目的就是降低各个单元的耦合,提高系统的可维护性。如Facade, Mediator模式

7) 单一职责原则(Single Responsibility Principle): 把耦合消灭在萌芽状态
* 就一个类而言,应该仅有一个引起它的变化的原因
* 在SRP中, 职责被定义为“变化的原因”
* 如果一个类承担的职责过多,导致职责耦合,一个职责的变化可能会削弱或者抑制这个类完成其它职责的能力。
* 一个职责变化引起该类关于该职责的接口的变化会导致所有使用该类其它职责的客户重新编译。
* 一个职责可能使用了一些库,导致这个类的其它职责的客户虽然不需要该功能却又不得不引入这些库。



你可能感兴趣的:(面向对象的设计原则)