面向对象的设计原则

面向对象的设计原则

我觉得能成为一名程序员,至少不会是一个笨的人,要完成一个功能,总能想办法实现,但实现的方法思路却有好有坏,不过我认为思路可以被引导,软件开发不是才刚开始,它已经存在一段时间,我们可以吸收前人的一些经验教训来提高自己,帮我们总结了很多问题的解决思路。这是设计原则带给我们的便利。
类的主要设计原则有七个,包括:开闭原则、里氏代换原则、迪米特原则(最少知道原则)、单一职责原则、接口分隔原则、依赖倒置原则、组合/聚合复用原则。
七大原则之间并不是相互孤立的,彼此间存在着一定关联,一个可以是另一个原则的加强或是基础。违反其中的某一个,可能同时违反了其余的原则。

单一职责原则:Single Responsibility Principle

一个类有且仅有一个职责,只有一个引起它变化的原因。

简单来说一个类只做好一件事就行,不去管跟自己不相干的,狗拿耗子多管闲事,其核心就是解耦以及高内聚。这个原则看着很简单,我们在写代码的时候即便不知道这个原则也会往这个方向靠拢,写出功能相对单一的类,不过这个原则很容易违背,因为可能由于某种原因,原来功能单一的类需要被细化成颗粒更小的职责1跟职责2,所以在每次迭代过程中可能需要重新梳理重构之前编写的代码,将不同的职责封装到不同的类或者模块中。

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

软件实体(模块,类,方法等)应该对扩展开放,对修改关闭。

概念理解
开闭原则是指在进行面向对象设计中,设计类或其他程序单位时,应该遵循:

对扩展开放(open)
对修改关闭(closed) 的设计原则。

开闭原则是判断面向对象设计是否正确的最基本的原理之一。

根据开闭原则,在设计一个软件系统模块(类,方法)的时候,应该可以在不修改原有的模块(修改关闭)的基础上,能扩展其功能(扩展开放)。

扩展开放:某模块的功能是可扩展的,则该模块是扩展开放的。软件系统的功能上的可扩展性要求模块是扩展开放的。
修改关闭:某模块被其他模块调用,如果该模块的源代码不允许修改,则该模块修改关闭的。软件系统的功能上的稳定性,持续性要求模块是修改关闭的。

接口隔离原则:Interface Segregation Principle

该原则的定义:不能强迫用户去依赖那些他们不使用的接口。简单来说就是客户端需要什么接口,就提供给它什么样的接口,其它多余的接口就不要提供,不要让接口变得臃肿,否则当对象一个没有使用的方法被改变了,这个对象也将会受到影响。接口的设计应该遵循最小接口原则,其实这也是高内聚的一种表现,换句话说,使用多个功能单一、高内聚的接口总比使用一个庞大的接口要好。

标题里氏替换原则(Liskov Substitution Principle ,LSP)

所有引用基类的地方必须能透明地使用其派生类的对象。

概念理解
也就是说,只有满足以下2个条件的OO设计才可被认为是满足了LSP原则:

不应该在代码中出现if/else之类对派生类类型进行判断的条件。

派生类应当可以替换基类并出现在基类能够出现的任何地方,或者说如果我们把代码中使用基类的地方用它的派生类所代替,代码还能正常工作。

依赖倒换原则

“设计要依赖于抽象而不是具体化”。换句话说就是设计的时候我们要用抽象来思考,而不是一上来就开始划分我需要哪些哪些类,因为这些是具体。

“High level modules should not depend upon low level modules, both
should depend upon abstractions. Abstractions should not depend upon
details, details should depend upon abstractions.”

高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

另一种表述为: 要针对接口编程,不要针对实现编程。即“Program to an interface, not an implementation.”

优点:人的思维本身实际上就是很抽象的,我们分析问题的时候不是一下子就考虑到细节,而是很抽象的将整个问题都构思出来,所以面向抽象设计是符合人的思维的。另外这个原则会很好的支持(开闭原则)OCP,面向抽象的设计使我们能够不必太多依赖于实现,这样扩展就成为了可能。

迪米特原则(最少知道原则)(Law of Demeter ,LoD)

迪米特原则(Law of Demeter)又叫最少知道原则(Least Knowledge Principle),可以简单说成:talk only to your immediate friends,只与你直接的朋友们通信,不要跟“陌生人”说话。

概念理解
对于面向OOD来说,又被解释为下面两种方式:

1)一个软件实体应当尽可能少地与其他实体发生相互作用。

2)每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

朋友圈的确定
“朋友”条件:

当前对象本身(this)
以参量形式传入到当前对象方法中的对象
当前对象的实例变量直接引用的对象
当前对象的实例变量如果是一个聚集,那么聚集中的元素也都是朋友
当前对象所创建的对象
任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”。

合成/聚合复用原则 - Composite/Aggregate Reuse Principle(CARP / CRP)

1) 定义
尽量采用组合(contains-a)、聚合(has-a)的方式而不是继承(is-a)的关系来达到软件的复用目的

2)基本概念
如果新对象的某些功能在别的已经创建好的对象里面已经实现,那么应当尽量使用别的对象提供的功能,使之成为新对象的一部分,而不要再重新创建

组合/聚合的优缺点:类之间的耦合比较低,一个类的变化对其他类造成的影响比较少,缺点:类的数量增多实现起来比较麻烦

继承的优点:由于很多方法父类已经实现,子类的实现会相对比较简单,缺点:将父类暴露给了子类,一定程度上破坏了封装性,父类的改变对子类影响比较大

3)优点
可以降低类与类之间的耦合程度
提高了系统的灵活性

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页