OO设计原则

1         目的:


设计原则是基本的工具,应用这些规则可使代码更加灵活、更容易维护,更容易扩展

2         分类


2.1                    SRP(单一职责)

The single responsibility principle

系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成。

Every object in your system should have a single responsibility ,

and all the object s services should  be focused on carrying out
that single responsibility .

每一个职责都是一个设计的变因,需求变化的时候,需求变化反映为类职责的变化。

当你系统里面的对象都只有一个变化的原因的时候,你就已经很好的遵循了SRP原则。

如果一个类承担的职责过多,就等于把这些职责耦合在了一起。一个职责的变化就可能削弱或者抑制

这个类其它职责的能力。这种设计会导致脆弱的设计。当变化发生的时候,设计会遭到意想不到的破坏。

SRP 让这个系统更容易管理维护,因为不是所有的问题都搅在一起。

内聚Cohesion 其实是SRP原则的另外一个名字.你写了高内聚的软件其实就是说你很好的应用了SRP原则。

怎么判断一个职责是不是一个对象的呢?你试着让这个对象自己来完成这个职责,比如:“书自己阅读内容”,

阅读的职责显然不是书自己的。

仅当变化发生时,变化的轴线才具有实际的意义,如果没有征兆,那么应用SRP或者任何其它的原则都是不明智的。

2.2                    DRY
(不要重复代码)


Don‘t repeat yourself Principle

通过抽取公共部分放置在一个地方避免代码重复.

Avoid duplicate code by abstracting out things that are common and placing
those thing in a single location .

DRY 很简单,但却是确保我们代码容易维护和复用的关键。

你尽力避免重复代码候实际上在做一件什么事情呢?是在确保每一个需求和功能在你的系统中只实现一次,否则就存在浪费!系统用例不存在交集,所以我们的代码更不应该重复,从这个角度看DRY可就不只是在说代码了。

DRY 关注的是系统内的信息和行为都放在一个单一的,明显的位置。就像你可以猜到正则表达式在.net中的位置一样,因为合理所以可以猜到。

DRY 原则:如何对系统职能进行良好的分割!职责清晰的界限一定程度上保证了代码的单一性

 

2.3                    OCP
(开闭原则)

Open-Close Principle

类应该对修改关闭,对扩展打开;

Classes should be open for extension ,and closed  for modification
.

OCP 关注的是灵活性,改动是通过增加代码进行的,而不是改动现有的代码;

OCP的应用限定在可能会发生的变化上,通过创建抽象来隔离以后发生的同类变化

OCP原则传递出来这样一个思想:一旦你写出来了可以工作的代码,就要努力保证这段代码一直可以工作。这可以说是一个底线。稍微提高一点要求, 一旦我们的代码质量到了一个水平,我们要尽最大努力保证代码质量不回退。这样的要求使我们面对一个问题的时候不会使用凑活的方法来解决,或者说是放任自流的方式来解决一个问题;比如代码添加了无数对特定数据的处理,特化的代码越来越多,代码意图开始含混不清,开始退化。

OCP 背后的机制:封装和抽象;封闭是建立在抽象基础上的,使用抽象获得显示的封闭;

继承是OCP最简单的例子。除了子类化和方法重载我们还有一些更优雅的方法来实现比如组合;

怎样在不改变源代码(关闭修改)的情况下更改它的行为呢?答案就是抽象,OCP背后的机制就是抽象和多态

没有一个可以适应所有情况的贴切的模型!一定会有变化,不可能完全封闭.

对程序中的每一个部分都肆意的抽象不是一个好主意,正确的做法是开发人员仅仅对频繁变化的部分做出抽象。

拒绝不成熟的抽象和抽象本身一样重要。

OCP是OOD很多说法的核心,如果这个原则有效应用,我们就可以获更强的可维护性可重用 灵活性 健壮性

LSP是OCP成为可能的主要原则之一

2.4                    LSP(子类必须能够替换基类)


The Liskov substitution principle

子类必须能够替换基类。

Subtypes must be substitutable  for their base types.

LSP关注的是怎样良好的使用继承.

必须要清楚是使用一个Method还是要扩展它,但是绝对不是改变它。

LSP清晰的指出,OOD的IS-A关系是就行为方式而言,行为方式是可以进行合理假设的,是客户程序所依赖的。

LSP让我们得出一个重要的结论:一个模型如果孤立的看,并不具有真正意义的有效性。

模型的有效性只能通过它的客户程序来表现。必须根据设计的使用者做出的合理假设来审视它。

而假设是难以预测的,直到设计臭味出现的时候才处理它们。

对于LSP的违反也潜在的违反了OCP

2.5                    DIP(依赖倒置原则)


高层模块不应该依赖于底层模块 二者都应该依赖于抽象

抽象不应该依赖于细节 细节应该依赖于抽象

什么是高层模块?高层模块包含了应用程序中重要的策略选择和业务模型。

这些高层模块使其所在的应用程序区别于其它。

如果高层模块依赖于底层模块,那么在不同的上下文中重用高层模块就会变得十分困难。然而,

如果高层模块独立于底层模块,那么高层模块就可以非常容易的被重用。该原则就是框架设计的核心原则。

这里的倒置不仅仅是依赖关系的倒置也是接口所有权的倒置。应用了DIP我们会发现往往是客户拥有抽象的接口,

而服务者从这些抽象接口派生。

这就是着名的Hollywood原则:"Don‘t call us we‘ll call you."

底层模块实现了在高层模块声明并被高层模块调用的接口。

通过倒置我们创建了更灵活 更持久更容易改变的结构

DIP的简单的启发规则:依赖于抽象;这是一个简单的陈述,该规则建议不应该依赖于具体的类,

也就是说程序汇总所有的依赖都应该种植于抽象类或者接口。

如果一个类很稳定,那么依赖于它不会造成伤害。然而我们自己的具体类大多是不稳定的,

通过把他们隐藏在抽象接口后面可以隔离不稳定性。

依赖倒置可以应用于任何存在一个类向另一个类发送消息的地方

依赖倒置原则是实现许多面向对象技术多宣称的好处的基本底层机制,是面向对象的标志所在。

 

2.6                    ISP(接口隔离原则)

 

不应该强迫客户程序依赖它们不需要的使用的方法。

接口不是高内聚的,一个接口可以分成N组方法,那么这个接口就需要使用ISP处理一下。

接口的划分是由使用它的客户程序决定的,客户程序是分离的接口也应该是分离的。

一个接口中包含太多行为时候,导致它们的客户程序之间产生不正常的依赖关系,我们要做的就是分离接口,实现解耦。

应用了ISP之后,客户程序看到的是多个内聚的接口。

时间: 2024-08-03 08:53:01

OO设计原则的相关文章

OO设计原则 -- OO设计的原则及设计过程的全面总结

这部分增加一点自己的感想,OO设计原则下面讲述的很清晰;看完之后有点感想如果我们在实际开发当中能够把这些原则熟烂于心的话那我们的代码质量和个人能力会有很显著的提神.根据自己的实际经验看很多开发者在开发过程中很多基本的知识确实没有熟烂于心导致开发的时候只有基本的内容.我所在的项目就是代码接口各种乱,可读性和可维护性特别差:当然自己在开发的时候也都没有做到,在后面的工作中尽量避免 前面发表了5篇OO设计原则的文章,在这里我将这个5个原则如何在我们设计过程进行应用进行一下总结, 这是我通过阅读和学习很

常用的OO设计原则

常用的OO设计原则: 1 封装变化:找出应用中可能需要变化之处,把它们独立出来,不要和哪些不需要变化的代码混在一起. 2  针对接口编程,而不是针对实现编程. 3 多用组合,少用继承. 4 为了交互对象之间的松耦合设计而努力. 5 类应该对扩展开放,对修改关闭. 6 依赖倒置:要依赖抽象,不要依赖具体类. 7 最少知识:只和你的亲密朋友交谈. 8 单一责任:一个类应该只有一个引起变化的原因. 原文地址:https://www.cnblogs.com/haiqin/p/9111444.html

OO六大设计原则

什么是设计原则?设计原则是基本的工具,应用这些规则可以使你的代码更加灵活.更容易维护,更容易扩展. 基本原则 封装变化面向接口编程而不是实现 优先使用组合而非继承SRP: The single responsibility principle 单一职责系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成.只能让一个类有且仅有一个职责. 每一个职责都是一个设计的变因,需求变化的时候,需求变化反映为类职责的变化.当你系统里面的对象都只有一个变化的原因的时候,你就已经很好的

OO设计基本原则

OO本身就是一种大的设计模式,它是随着软件规模越来越大产生出来帮助人们建模和开发的理念,生来就带着封装.继承.多态等可复用基因.为了充分发挥这些基因的功效,使用者需要遵守一定的原则,就是所谓的面向对象设计原则.然而正确地使用这些运用这些原则并不容易,只有把这些原则吸收成为身体一部分的经验丰富的工程师才能在遇到各种问题时,灵活地使用它们.一些OO大师为了方便新手更好地理解OO原则,就根据经验假象了一些软件设计过程中经常碰到的问题,并给出了遵循OO原则的解决这些问题的设计方案,就产生了设计模式,正如

OO的设计原则

今天同事和我们一起讨论分享了OO的设计原则,讨论使人明晰,有人一起讨论学习是一件幸福的事情. 1.开闭原则 对功能的扩展是开放的,对修改是闭合的. 可以应用于类的设计,框架的设计等. 为什么?开闭原则有利于保护已有的客户端代码,让原有的代码不会因为框架的扩展修改而发生变动,减少维护的成本. 如果你设计的框架经常变动,而且每次变动使使用的人要改很多,那么没人敢用了. 2.单一职责原则 应用于实现类,如果类有变化,那么引起变化的原因仅有一个 为什么?如果你在设计类的时候,没有进行接口拆分设计,直接封

java设计原则:16种原则

一   类的设计原则   1 依赖倒置原则-Dependency Inversion Principle (DIP) 2 里氏替换原则-Liskov Substitution Principle (LSP) 3 接口分隔原则-Interface Segregation Principle (ISP) 4 单一职责原则-Single Responsibility Principle (SRP) 5 开闭原则-The Open-Closed Principle (OCP) 二  包的设计原则   6

面向设计原则理解

如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 面向对象设计(OOD)核心原则让我的程序模块达到"高内聚低耦合",这是来自于30年前兴起的结构化设计(structured Design),但是同样适用于我们的OOD. 1.高内聚: 高内聚是指某个特定模块(程序,类型)都应完成一系列相关功能,描述了不同程序,类型中方法,方法中不同操作描述的逻辑之间的距离相近.高内聚意味可维护性,可重新性,因为模块对外部的依赖少(功能的完

.NET 高级架构师0005 架构师之路(4)---面向对象的设计原则

1         OO的设计原则 采用面向对象的分析和设计思想,为我们分析和解决问题提供了一种全新的思维方式.我们在拿到需求之后(略去OOA,以后补全),接下来的问题就是:如何对系统进行面向对象的设计呢? 按照软件工程的理论,面向对象的设计要解决的核心问题就是可维护性和可复用性.尤其是可维护性,它是影响软件生命周期重要因素,通常情况下,软件的维护成本远远大于初期开发成本. 一个可维护性很差的软件设计,人们通常称之为"臭味"的,形成的原因主要有这么几个:过于僵硬.过于脆弱.复用率低或者

面向对象的三个基本特征 和 五种设计原则

一.三个基本特征 面向对象的三个基本特征是:封装.继承.多态. 封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 继承 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 通过继承创建的新类称为"子类"或"