在软件设计、编码过程中有几个基本原则即SOLID原则,学习理解能够帮忙我们写出更健壮的代码。SOLID是五个基本原则的首字母。这五个原则如下:

  • Single responsibility

  • Open–closed

  • Liskov substitution

  • Interface segregation

  • Dependency inversion

此篇来学习一下单一职责原则(Single responsibility)

相信很多人都听过单一职责原则(Single Responsibility Principle),那么什么是单一职责原则,怎么才算单一职责原则呢,单一职责原则又有什么好处呢。

记得当初刚开始进入项目组做需求的时候,完全不清楚什么设计模式、架构。一个问题单就困扰很久,慢慢搬砖越来越多,对项目的代码结构、业务有了一定的了解之后,回头看看自己写的代码,真是不忍直视。有一次写发送邮件的代码,将组装邮件内容、附件、发送等全部柔和在一个类里面,然后一位老大哥给review代码的时候就发现问题了,说你这个类写的太乱了,把什么都写在一个类里面了,完全不符合"单一职责原则",当时那个脸红啊,赶紧虚心请教。

什么是单一职责原则呢?

我们来看看定义:一个类应该有且仅有一种原因引起改变(A class should have only one reason to change)

一个职责就是一种会引起类的改变的原因,即如果我们有两种情况(原因)会改变一个类,那么我们就需要把这个类拆分成两个。如果一个类有多个职责,那么当其中一个职责状态改变,那么可能会影响到其他的职责。比如下面这段代码:

// 单一职责?
interface IEmail {public void setSender(String sender);public void setReceiver(String receiver);public void setContent(String content);
}class Email implements IEmail {// set sender;public void setSender(String sender) {}// set receiver;public void setReceiver(String receiver) {}// set content;public void setContent(String content) {}
}

IEmail是一个接口,Email是一个简单的电子邮件类,保存了发送者,接受者,和邮件内容。看上去好像没什么问题,首先不管怎么样,都会有发送者和接收者,对应就是email,比如写信,一定是有写信人和收信人,但是邮件内容可能会变化,比如说,我们现在的内容是字符串,但是字符串无法实现丰富多彩的样式,随着业务的发展,将来可能要支持HTML、markdown等其他的格式,这个时候就需要修改IEmail和Email,可能会有类似这样的setContent(HTMLContent content)。

如果我们希望实现单一职责模式呢?是否要把content和sender, receiver拆分开呢。

我们可以建立新的接口和类–IContent和Content,来拆分原来的两个职责。具体代码如下:

// 单一职责原则 - 将原来的content改为IContent
interface IEmail {public void setSender(String sender);public void setReceiver(String receiver);public void setContent(IContent content);
}interface IContent {}class Email implements IEmail {// set sender;public void setSender(String sender) {}// set receiver;public void setReceiver(String receiver) {}// set content;public void setContent(IContent content) {}
}class Content implements IContent {}

这样修改以后,后面不管Content改成什么样的形式,都可以很方便的扩展,比如说可以

class Content implements IContent {}class HTMLContent implements IContent {}class MarkDownContent implements IContent {}

这样扩展起来是不是很方便呀。

单一职责原则的优点:

  • 降低类的复杂度
  • 提高可扩展性,以及类的可读性

我们引用《The UNIX Philosophy》书中的两条:

一:小即是美。

二:让程序只做好一件事。

单一职责原则(Single Responsibility Principle)相关推荐

  1. 软件设计原则(二)单一职责原则 -Single Responsibility Principle

    SRP,Single Responsibility Principle: There should never be more than one reason for a class to chang ...

  2. 设计模式原则篇:(1)单一职责原则--Single Responsibility Principle

    上篇文章提及到设计模式中应遵循的设计原则,并且列出了设计模式中应当遵循的六大原则. 次篇文章主要讨论单一职责原则. 单一职责原则(SRP): 不要存在多于一个导致类变更的原因.简单的讲,就是一个类或接 ...

  3. 单一职责原则(SIngel Responsibility Principle  SRP)

    SRP 用原话解释就是 There should never be more than one reason for a class to  change  翻译一下也就是有且只有一个原因引起该类的变 ...

  4. 面向对象设计之单一职责原则(Simple-Responsibility Principle)

    单一职责原则: 一个类只负责一个功能领域中的相应职责,即就一个类而言,应该只有一个引起它变化的原因.  好处: 降低类的复杂度,一个类只负责一项职责,其逻辑肯定比负责多项职责简单的多 复杂度低,可读性 ...

  5. 面向对象设计原则之一:单一职责原则

    单一职责原则(Single Responsibility Principle SRP) There should never be more than one reason for a class t ...

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

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

  7. 设计模式之禅之单一职责原则

    声明:本文为阅读秦小波所写的<设计模式之禅>所写小结,文章内容可能有部分引述此书. 单一职责原则(Single Responsibility Principle) 1.定义:    在接口 ...

  8. 设计模式七大原则:单一职责原则

    设计模式目的 软件设计模式(Design pattern),又称设计模式,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证 ...

  9. 设计模式-单一职责原则-实践运用

    单一职责原则-概念 1.单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小. 2.单一职责原则定义如下: 单一职责原则(Single Responsibility Principle, S ...

最新文章

  1. LoadRunner11设置场景百分比模式完成多台客户端负载测试
  2. innodb一页为什么要存储两行记录_innodb数据记录存储结构
  3. 闲话WPF之十(Dependency属性 [2] )
  4. 硬盘安装Linux救援系统,通过急救系统里往硬盘里安装 alpine linux
  5. Wannafly交流赛1: C. 腰带图(瞎搞)
  6. java如何实现下载_java 如何实现下载功能
  7. pytorch保存.pth文件
  8. 仅使用Python代码从零开始进行Logistic回归
  9. Linux定时任务-定时锁屏
  10. 【求职】360 C++反向面经
  11. 5V转1.8V稳压芯片,3.7V转1.8V稳压芯片
  12. §1.1自然数 上•序数理论
  13. Multiple View Geometry(多视图几何)学习笔记(23)—射影摄像机对二次曲面的作用摄像机中心的重要性
  14. windows获取iOS设备信息
  15. 朴灵:打破限制,从前端到全栈
  16. 货币竞争,不是货币战争
  17. programming notes - 在线学习资源
  18. 计算机网络中传输速率最快的,计算机网络中常用的传输介质中传输速率最快的是什么...
  19. 10Gb每秒!SM4的单核“心”!海泰携手海量数据安全“闪”护
  20. 什么是Gamma 曲线

热门文章

  1. 怀化市2021年高考查询成绩,怀化三中奏响2021年高考集结号
  2. IT运维如何完成一场高质量复盘
  3. 第3章 关系数据库标准语言SQL
  4. nova75g什么时候更新鸿蒙系统,华为nova7升级到EMUI11,8大功能提升,带来更新体验...
  5. 后端开发面试题整理 2019
  6. CodeForces 286E
  7. probe 加载过程 和初始化关系
  8. 使用sql语句创建表、修改表、添加列等
  9. 智能安防系统中的人工智能应用实践思考
  10. 如何在Dreamweaver CS3中使用自定义字体