面向对象编程的基本原则

面向对象的基本设计原则有:单一职责原则,开放-封闭原则,依赖倒转原则,里氏代换原则,迪米特法则,接口隔离原则。

1.单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。

如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。也就是说,当能够想到多余一个动机去改变一个类,那么这个类就具有多余一个的职责,也就应该考虑类的职责分离。

2.开放-封闭原则:是说软件实体(类、模板、函数等)应该可以扩展,但是不可修改。

开放-封闭原则的两个特征:一是说对于扩展是开放的,另一个是说对于更改是封闭的。也就是说,当有新的需求或者变化时,设计的软件可以相对容易修改,可以对现有的代码进行扩展,来适应新的情况,而不是说当有新的需求时,从头来设计这个程序。

实现开放-封闭原则的核心思想就是对抽象编程,而不是对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,所以修改就是封闭的;而通过面向对象的继承和多态机制,又可以实现对抽象类的继承,通过覆写其方法来改变固有行为,实现新的拓展方法,所以扩展就是开放的。

开放-封闭原则是面向对象设计的核心,遵循这个原则可以带来许多好处,例如,可维护、可扩展、可复用、灵活性好等。然而,对于应用程序中的每个部分都刻意进行抽象不是一个好主意,应当拒绝不成熟的抽象。

3.依赖倒转原则:A.高层模块不应该依赖低层模块。两个都应该依赖抽象。

                B.抽象不应该依赖细节。细节应该依赖抽象。

面向过程的开发中,往往为了使代码可以复用,一般都将常用代码写成许多的程序库,这样在做新的项目时,去调用这些低层的函数。这就是高层模块依赖于低层模块。就像是电脑里如果CPU、内存、硬盘都依赖于具体的主板,主板坏了,所有的部件就都没用了。这肯定是不合理的。而如果不管是高层模块还是低层模块,它们都依赖于抽象(接口或者抽向类),只要接口是稳定的,那么任何一个的更改都不用担心其他受到影响,这样使得无论高层模块还是低层模块都可以很容易的被复用。

依赖倒置原则可以说是面向对象设计的标志,编写代码时应时刻考虑针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口。

4.里氏代换原则:子类型必须能够替换掉它们的父类型。

只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正的被复用,而子类也能在父类的基础上增加新的行为。例如,猫继承了动物类,以动物的身份拥有吃、喝、叫等行为,当我们需要狗、猪也拥有类似的行为时,只需要更改实例化的部分,代码的其他部分都不需要改变。

5.迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

迪米特法则首先强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限。即一个类包装好自己的private状态,不需要让别的类知道的字段或行为不要公开。

迪米特法则的根本思想,是强调了类之间的松耦合。在程序设计时,类之间的耦合越弱,越有利于复用。

6.接口隔离原则:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。

我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。在程序设计中,依赖几个专用的接口要比依赖一个综合的接口更灵活。接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。

以上就是面向对象的基本设计原则,在进行程序设计时,遵守这些原则可以使我们的代码可维护、可扩展、可复用、灵活性好,需要我们在实践中时时刻刻的遵守这些原则。


你可能感兴趣的:(C++)