单一职责原则是面向对象原则五大原则中最简单,也是最重要的一个原则, 他的字面定义如下:

单一职责原则(Single Responsibility Principle, SRP): 一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。

从定义中可以看出在定义类的时候要将职责划分清楚, 不能让一个类负责干多个事情。换句话说就是一个类只有一个引起他变化的点。如果一个类负责干多个事情那么就会有多个引起他变化的原因。那么这个类就不稳定了,这个类就容易变化,因为我们知道如果干的事情越少变化的诱因就愈少,如果干的事情越多变化的诱因就愈多。变化的越多引起bug的可能性就越大, 最终就会影响到你设计的系统容易出现bug,反之系统出现bug的肯能性就越小。

现在我们有这么一个场景,对人员信息的维护, 通常对用数据库的操作如下:

    public class Employee
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public DateTime BirthDay { get; set; }
} public class EmployeeRepository
{
public void Create(Employee employee)
{
DataBase<Employee> dataBase = new DataBase<Employee>(); dataBase.Create(employee);
} public IEnumerable<Employee> Query()
{
DataBase<Employee> dataBase = new DataBase<Employee>(); return dataBase.Query();
}
}

咋一看这个设计似乎是没有问题的,但是在看看我们刚刚讲的那个原则,其实这个设计已经违背了我么的SRP原则,主要是EmployeeRepository 类的职责太多,它包含的两个方法,一个是给数据库中创建数据一个是查询数据,从这个拆分粒度上来说是EmployeeRepository 承担了两个职责。 因此我们因该将他拆分开来如下:

public class EmployeeRepository
{
public void Create(Employee employee)
{
DataBase<Employee> dataBase = new DataBase<Employee>(); dataBase.Create(employee);
}
} public class EmployeeQuery
{
public IEnumerable<Employee> Query()
{
DataBase<Employee> dataBase = new DataBase<Employee>(); return dataBase.Query();
}
}

这样我们就将原来的EmployeeRepository中的查询数据的职责拆分到EmployeeQuery类中,这样EmployeeRepository就只负责对数据的"写"操作而EmployeeQuery 只负责对数据"读"操作, 这就回到了计算机的本质上来了, 即计算机的本质就是 "读写".

写到这里就应该告一段落了, 但是我想很多人都会说第一个EmployeeRepository 的职责划分的也可以啊,只负责数据的操作啊, 其实这个问题也没有错, SRP原则本身就是一个充满争议的原则, 每个人对类的组织不同,职责的划分不同, 系统的规模不同对SRP使用也是不同, 对SRP的把握粒度也不同,这要根据具体问题具体对待.

【设计模式】单一职责原则(SRP)的更多相关文章

  1. C#软件设计——小话设计模式原则之:单一职责原则SRP

    前言:上篇C#软件设计——小话设计模式原则之:依赖倒置原则DIP简单介绍了下依赖倒置的由来以及使用,中间插了两篇WebApi的文章,这篇还是回归正题,继续来写写设计模式另一个重要的原则:单一职责原则. ...

  2. 电商架构设计-通过系统和业务拆分,遵循单一职责原则SRP,保障整个系统的可用性和稳定性

    个人观察 1.通过系统和业务拆分,遵循单一职责原则SRP,保障整个系统的可用性和稳定性. 2.单一职责原则SRP,真的很关键,广大程序员需要不断深入理解这个原则. 3.架构图是架构师的重要输出,通过图 ...

  3. 设计模式值六大原则——设计模式之六大原则——单一职责原则(SRP)

    定义: 应该有且仅有一个原因引起类的变更. There should never be more than one reason for a class to change. 优点: 1.类的复杂性降 ...

  4. IOS设计模式的六大设计原则之单一职责原则(SRP,Single Responsibility Principle)

    定义 就一个类而言,应该仅有一个引起它变化的原因. 定义解读 这是六大原则中最简单的一种,通俗点说,就是不存在多个原因使得一个类发生变化,也就是一个类只负责一种职责的工作. 优点 类的复杂度降低,一个 ...

  5. 架构师之路——单一职责原则SRP (我单纯,我快乐)

    定义: 不要存在多于一个导致类变更的原因.通俗地讲,一个类只做一件事情.   单一职责原则的好处: 1.类的复杂性降低,实现什么职责都有清晰明确的定义: 2.可读性提高,复杂性降低,那当然可读性提高了 ...

  6. 【面向对象设计原则】之单一职责原则(SRP)

    单一职责原则是面向对象原则五大原则中最简单,也是最重要的一个原则, 他的字面定义如下: 单一职责原则(Single Responsibility Principle, SRP): 一个类只负责一个功能 ...

  7. 面向对象的六大原则之 单一职责原则——SRP

    SRP = Single Responsibility Principle   定义:就一个类而言,应该只有一个能引起他变化的原因.通俗的说,即一个类只负责一项职责.   作用: 1.减少了类之间的耦 ...

  8. 单一职责原则SRP

    定义: There should nerver be more then one reason for a class to change. 优点: 1.类的复杂性降低,实现什么职责都有清晰明确的定义 ...

  9. 2单一职责原则SRP

    一.什么是单一职责原则 单一职责原则(Single Responsibility Principle ): 就一个类而言,应该仅有一个引起它变化的 原因. 二.多功能的山寨手机 山寨手机的功能: 拍照 ...

随机推荐

  1. Python之路-正则表达式

    作业一:整理正则表达式博客 正则表通常被用来检索.替换那些符合某个模式(规则)的文本,为了提取对自己有用的信息,由命令解释执行:而通配符和命令是同一级别,为了提示处理效率,直接由shell解释执行. ...

  2. Zookeeper的安装和初步使用

    1. Zookeeper集群角色 Zookeeper集群的角色:  Leader 和  follower  (Observer) zk集群最好配成奇数个节点 只要集群中有半数以上节点存活,集群就能提供 ...

  3. hdu 2157 How many ways?? (可达矩阵)

    题意:给你一个有向图,从A 点到 B点恰好经过k个点的方案数 (k < 20), 可以走重复边 思路:利用离散数学中的可达矩阵,可达矩阵的K次幂便是从i到j走K步能到达的方案数 代码: #inc ...

  4. 在Caffe中实现模型融合

    模型融合 有的时候我们手头可能有了若干个已经训练好的模型,这些模型可能是同样的结构,也可能是不同的结构,训练模型的数据可能是同一批,也可能不同.无论是出于要通过ensemble提升性能的目的,还是要设 ...

  5. MongoDB基础教程系列--第八篇 MongoDB 副本集实现复制功能

    为什么用复制 为什么要使用复制呢?如果我们的数据库只存在于一台服务器,若这台服务器宕机了,那对于我们数据将会是灾难,当然这只是其中一个原因,若数据量非常大,读写操作势必会影响数据库的性能,这时候复制就 ...

  6. Linux-进程描述(2)之进程标识符与进程位置

    在上一篇文章中详细介绍了task_struct结构体内的常见成员,然后我们就来看一下具体内容.每个进程都把它的信息放在 task_struct 这个数据结构中,task_struct 包含了这些内容: ...

  7. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十一)数据层优化-druid监控及慢sql记录

    本文提要 前文也提到过druid不仅仅是一个连接池技术,因此在将整合druid到项目中后,这一篇文章将去介绍druid的其他特性和功能,作为一个辅助工具帮助提升项目的性能,本文的重点就是两个字:监控. ...

  8. 用 Python 和 Stanford CoreNLP 进行中文自然语言处理

    实验环境:Windows 7 / Python 3.6.1 / CoreNLP 3.7.0 一.下载 CoreNLP 在 Stanford NLP 官网 下载最新的模型文件: CoreNLP 完整包 ...

  9. LinkBar选中项字体颜色

    通过控制disabledColor样式来控制,选中项字体的颜色.

  10. Azure IoT 技术研究系列5-Azure IoT Hub与Event Hub比较

    上篇博文中,我们介绍了Azure IoT Hub的使用配额和缩放级别: Azure IoT 技术研究系列4-Azure IoT Hub的配额及缩放级别 本文中,我们比较一下Azure IoT Hub和 ...