引言

  面向对象类设计,或者说是面向对象设计,有五大原则:

  •   Single Responsibility Principle     单一职责原则
  •   Open Closed Principle        开闭原则
  •   Liskov Substitution Principle     里氏替换原则
  •   Dependency Inversion Principle    依赖反转原则
  •   Interface Segregation Principle    接口隔离原则

  简介

  今天我们要接触的是SRP,单一职责原则。

  我觉得这些原则的目的就是要实现类的高内聚、低耦合。高内聚high cohision和低耦合low couple在很多时候都是我们的目标,不管我们引入设计模式,进行架构分析、设计、提高复用性,解耦decouple是我们共同的目标。

  There should never be more than one reason for a class to change.

  类的改变不应该由一个以上的原因导致,也就是说不应该有一个以上的原因可以导致类的改变。

  如果类的职责超过一个,这些职责之间就会产生耦合。改变一个职责,可能会影响和妨碍类为其他人服务的功能。这种类型的耦合将会导致脆弱的设计,在修改的时候可能会引入未逾期的问题。

  

  如上图所示,Rectangle类有两个方法:一个是在屏幕上画矩形,一个是计算矩形的面积。两个不同的应用会使用Rectangle类,一个应用使用Rectangle来帮助计算面积,它从来不会在屏幕画矩形。另外一个是图形界面的应用,也可能会计算面积,但是肯定会在屏幕画矩形。

  当前的设计就违反了SRP原则,Rectangle类有两个职责,一个是为数学模型提供几何的矩形,计算面积;另外一个职责是为图形用户界面提供矩形的显示。

  这个违反SRP原则的设计会导致很多严重的问题。首先,在计算几何应用中必须包含GUI。因为计算几何应用可能就是一个控制台程序,不需要用户界面,但是由于需要使用这个违反SRP原则的类,就必须要包含GUI的类库,在编译的时候要同时编译,在部署的时候还增加了部署的内容,而且这些内容可能永远都不会被用到。

  其次,如果图形应用的变化,需要修改Rectangle类的话。我们的计算几何应用也必须要重新编译和部署,因为它也引用了相同的Rectangle类,如果不那么做的话,可能会发生意外的错误(因为Rectangle类被修改了,不知道有没有什么影响)。

  好一点的做法是将Rectangle分解为两个类,如下图所示

  

将计算面积部分从Rectangle类中分离出来,产生一个GeometricRectangle类,专门用来计算面积。这样的话,对于画矩形方法的修改就不会影响到计算几何应用了。也不用在部署多余的内容。
什么是职责?
在上文中,我们将单一职责定义为“一个改变的原因”。如果你想出超过一个改变类的动机,就说明类具有多个职责。这很难以发现。我们习惯于按照组来思考职责。例如,考虑下面的Modem接口。
interface IModem
    {
        public void Dial(string no);
        public void Hangup();
        public void Send(char c);
        public char Reveive();
    }

  我们中的大多数人认为上面的接口已经设计的不错了,四个功能也都是modem的功能。

但是,这里其实是两个职责。一个职责是连接管理,另外一个是数据通信。Dial和Hangup方法管理moden的链接,Send和Receive管理modem的数据通信。
这两个职责是否应该分开呢?毫无疑问是应该的。这两个职责是没有关系的。他们改变的原因不尽相同。而且,他们会被应用的不同部分调用,这两个部分也会因为不同的原因变化。
上图的做法可能更好,将接口分为两个。然后有一个类来实现这两个接口,代表一个modem。
结论
SRP原则是最简单的原则之一,也是最难做好的原则之一。我们会很自然的将职责连接在一起。找到并且分离这些职责是软件设计需要达到的目的。

转载于:https://www.cnblogs.com/virusswb/archive/2010/06/29/OO-Class-Design-Single-Responsibility-Principle.html

面向对象类设计的五大原则(一)单一职责原则Single Responsibility Principle相关推荐

  1. Java设计原则之单一职责原则、开闭原则、里氏代换原则

    文章目录 面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 面向对象设计原则概述 软件的可维护性(Maintainability)和可复用性(Reusability)是两个非常重要的用于衡量 ...

  2. 面向对象的七种原则:单一职责原则,开放关闭原则

    我们的知识星球马上就要开始更新设计模式了,在更新设计模式之前,我们是不是需要做一些准备呢?否则设计模式中一些遵循的原则大家会一头雾水,所以我今天来给大家说一些面向对象的七种原则,有人说是6种有人说是7 ...

  3. 经典设计原则:单一职责原则(SRP)

    本文详解设计原则中的单一职责原则,目的还是提高代码的可读性.可扩展性.复用性.可维护性等. 目录 1. 单一职责原则(SRP) 2. 如何理解单一职责原则? 3. 如何判断类的职责是否足够单一? 4. ...

  4. 七大设计原则之单一职责原则应用

    目录 1 单一职责原则介绍 2 单一职责原则应用 1 单一职责原则介绍 单一职责(Simple Responsibility Pinciple,SRP)是指不要存在多于一个导致类变更的原因.假设我们有 ...

  5. SOLID原则:单一职责原则(SRP)

    SOLID:SOLID 原则并非单纯的1个原则,而是由5个设计原则组成,它们分别是:单一职责原则.开闭原则.里式替换原则.接口隔离原则和依赖反转原则,SOLID 由5个设计原则的头一个字母组成. 如何 ...

  6. 设计模式六大原则(一)----单一职责原则

    设计模式六大原则之[单一职则原则] 一.什么是单一职责原则 首先, 我们来看单一职责的定义. 单一职责原则,全称Single Responsibility Principle, 简称SRP. A cl ...

  7. 【设计模式六大原则】:单一职责原则-带你走梦幻西游(一)

    依赖倒置原则(二) 开闭原则(三) 迪米特原则-带你走进梦幻西游(四) 里氏替换原则(五) 接口隔离原则(六) 定义       单一职责原则的英文名称是Single Responsibility P ...

  8. 接口隔离原则和单一职责原则区别

    接口隔离原则和单一职责原则区别 单一职责原则是备受争议的原则,根据不同的业务逻辑,它会将系统功能模块划分成不同种类,产生多样的接口,同时每个接口尽量只包含一个功能(方法). 而产生争议的原因就是这个业 ...

  9. 设计模式---面向对象设计原则之单一职责原则

    单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小.单一职责原则定义如下: 单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功能领 ...

  10. 面向对象五大原则_1.单一职责原则amp;2.里氏替换原则

    单一职责原则:Single Responsibility Principle (SRP) 一个类.仅仅有一个引起它变化的原因.应该仅仅有一个职责.每个职责都是变化的一个轴线.假设一个类有一个以上的职责 ...

最新文章

  1. python内置数据结构之dict
  2. 重磅直播|慕尼黑工业大学博士详解室内SLAM中的几何约束
  3. 塑料:泡两天澡我就消失了?酶降解塑料居然可以这么快 | Nature
  4. 生物化学与分子生物学分析技术 Analytical Techniques in Biochemistry and Molecular Biology 英文原版
  5. 三十一、Vue框架赶紧来了解一下
  6. spring中bean的高级属性之list, set, map以及props元素(含举例)
  7. 超全PHP学习资源整理:入门到进阶系列
  8. 机器学习问题总结(03)
  9. Anaconda卸载与重装过程记录
  10. 测绘工程所用软件评析
  11. 函数式编程:如何高效简洁地对数据查询与变换
  12. 【java】java 如何抛出 sleep interrupted
  13. linux 重定向_Linux视频教程分享,零基础在家你也可以学的会
  14. EOS.IO技术学习
  15. 使用layui 做后台管理界面,在Tab中的链接点击后添加一个新TAB的解决方法
  16. tensorflow2.0对应python版本_TensorFlow2.1.0最新版本安装详细教程
  17. 【Java】URL下载网络资源(CloudMusic)
  18. python两个excel做匹配_python链接两张excel表格数据-如何用python从excel中同时提取两个列的数据,并生......
  19. 三插头内部结构图_三孔插座内部结构
  20. 【lomoyi笔记】2020.7.31VMware虚拟机安装黑苹果macOS Catalina10.15

热门文章

  1. demo2 Kafka+Spark Streaming+Redis实时计算整合实践 foreachRDD输出到redis
  2. MyBatis实现分页
  3. 在mininet中测试TCP、UDP带宽并作图
  4. Android ADT 无法在线安装,离线下载ADT压缩包方法。SDK Manager无法更新
  5. 反射:集合泛型的本质
  6. 机器学习:过拟合问题与其正则化解决
  7. BZOJ1646[Usaco2007 Open] 抓住那头牛
  8. java 动态属性_Java 类动态添加属性字段的操作
  9. r语言html帮助是什么东西,R语言帮助的使用
  10. python代码价格_在Python中如何用代码求出超过某价格的且受欢迎程度top5的菜品名?...