面向对象设计原则

Posted 顾文繁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象设计原则相关的知识,希望对你有一定的参考价值。

1 开闭原则(Open-Closed Principle,OCP)

软件实体对扩展是开放的,但对修改是闭源是关闭的,即在不修改的一个软件实体上的基础上去扩展其功能。

开闭原则由Dertran(Meyer丁1988年堤出,它是面向刘象设计中最重要的原则之--。在开闭原则的定义中.软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。

任何软件都的要面临一个很重要的问题,印对它们需求会随时间的推移而发生变化。当软件系统游要面对新的需求时,我们应该尽量保证系统的设计框架是稳定的。如果一个软件设i计符合开闭原则,那么可以非常方便地对系统进行扩展.i面i且在扩展时无须修改现有代码.使得软件系统在拥有适应性和灵活性的同时具备较好的稳定性和延续性。

为了满足开闭原则.需要对系统进行抽象化设计,抽象化是开闭原则的关键。在类似Java/C#这样的面向对象编程语言中,可以为系统定义一个相对稳定的抽象层,而将不同的实现行为在具体的实现层中完成。在很多面向对象编程语言中都提供了接口、抽象类等机制,可以通过它们定义系统的抽象层,再通过具体类来进行扩展。如果需要修改系统的行为,无须对抽象层进行任何改动.只需要增加新的具体炎米实现新的业务功伲邸可,实现在不修改已有代码的基础上扩展系统的功能,达到开闭原则的要求。

开闭原则还可以通过一个更加具体的“对可变性封装原则"来描述,对可变性封装原则(Prineipleof Encapsulation of Variation,EVP)要求找到系统的可变因素并将其封装起米。如将抽象层的不同实现封装到不同的具体类中,而且EVP要求尽量不要将一种可变性和另一种可变性混合在--起,这将导致系统中类的个数忽剧增长,增加系统的复杂度。

百分之百的开闭原则很难达到,但是要尽可能使系统设计符合开闭原则,后面所学的里氏代换原则、依赖倒转原则等都是开闭原则的实现方法。在24种设计模式中,绝大部分的设计模式都符合开闭原则,在对每一个模式进行优缺点评价时都会以开闭原则作为一个重要的评价依据,以判断基于该模式设计的系统是否具备良好的灵活性和可扩展性。

 

2 依赖倒置原则(Dependence Inversion Principle, DIP)

要针对抽象层编程,而不针对具体类型编程

高层模块不应该依赖底层模块,他们都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。或者另外一种表述:“要针对接口编程,不要针对实现编程” 。

3 单一职责原则(Single Responsibility Principle,SRP)

类的指责要单一,不能讲太多的指责放在一个类中。

一个类(或者大到模块,小到方法)承担的职责越多,它被复用的可能性越小,而且如果一个类承担的职责过多,就相当于将这些职责耦合在--起,当其中一个职责变化时,可能会影响其他职责的运作。 

类的职责主要包括两个方面:数据职责和行为职责,数据职责通过其属性来体现,而行为职责通过其方法来体现。如果职责太多,将导致系统非常脆弱,-一个职责可能会影响其他职责,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可将它们封装在同一类中。

单一职责原则是实现高内聚、低耦合的指导方针,在很多代码重构手法中都能找到它的存在,它是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关重构经验。

4 里氏代换原则

在软件系统中,一个可以接受基类对象的地方,必然可以接受一个子类对象。

通俗的讲,就是在软件中,如果能够使用基类对象,那么一定能够使用其子类对象。把基类对象都替换成它的子类。把基类对象替换成他的子类,程序将不会产生任何错误和异常,反过来则不成立。 

 5 合成复用原则

在系统中应该尽量多使用组合和聚合关联关系,尽量少使用甚至不使用继承关系。

 

 

 

 

 

以上是关于面向对象设计原则的主要内容,如果未能解决你的问题,请参考以下文章

面向对象设计的6个设计原则最早谁提出的

面向对象设计的基本原则都有哪些

设计模式2 面向对象设计原则

面向对象七大设计原则

面向对象设计原则

设计模式:面向对象的设计原则下(ISP、DIP、KISS、DRY、LOD)