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

单一职责原则(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. IOS设计模式的六大设计原则之单一职责原则(SRP,Single Responsibility Principle)

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

  2. 开放-封闭原则(OCP)开-闭原则 和 依赖倒转原则,单一职责原则

    单一职责原则 1.单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因 2.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或抑制这个类完成其他职责的能力. ...

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

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

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

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

  5. 最简单直接地理解Java软件设计原则之单一职责原则

    理论性知识 定义 单一职责原则, Single responsibility principle (SRP): 一个类,接口,方法只负责一项职责: 不要存在多余一个导致类变更的原因: 优点 降低类的复 ...

  6. java6大原则之单一职责原则,里式替换原则

    单一职责原则:一个接口,一个类,一个方法,最好只做一类事,当然,在真实的项目中,一系列因素下,很难做到单一职责原则,但是针对接口是可以做到的,方法和类要尽量做到 里式替换原则:父类出现的地方,换成子类 ...

  7. 设计模式学习--面向对象的5条设计原则之单一职责原则--SRP

    一.SRP简介(SRP--Single-Responsibility Principle): 就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因.   所谓职责,我们可以理解他为功能,就是设 ...

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

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

  9. 单一职责原则(Single Responsibility Principle,SRP)

    定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的 ...

  10. 080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则

    080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则 本文知识点:单一职责原则 说明:因为时间紧张,本人写博客过程中只是 ...

随机推荐

  1. rz快速上传文件到ssh服务器

    [root@k8s01 ~]# rz --helprz version 0.12.20Usage: rz [options] [filename.if.xmodem]Receive files wit ...

  2. 如何理解Python装饰器

    如何理解Python装饰器?很多学员对此都有疑问,那么上海尚学堂python培训这篇文章就给予答复. 一.预备知识 首先要理解装饰器,首先要先理解在 Python 中很重要的一个概念就是:“函数是 F ...

  3. js 动态生成背景图 GeoPattern

    以前有个想法,能不能用JS动态创建CANVAS绘制图案当网页背景,在网络发现有现成的别人已经实现的:GeoPattern 代码如下: <!DOCTYPE html> <html> ...

  4. Java线程池核心原理剖析

    在系统开发时,我们经常会遇到“池”的概念.使用池一种以空间换时间的做法,通常在内存中事先保存一系列整装待命的对象,以供后期供其他对象随时调用.常见的池有:数据库连接池,socket连接池,线程池等.今 ...

  5. Go接口interface

    目录 接口是什么? interface类型 空接口(interface{}) interface函数参数 interface变量存储的类型 类型断言 嵌入interface 接口是什么? Go 语言不 ...

  6. 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  7. [Swift]LeetCode483. 最小好进制 | Smallest Good Base

    For an integer n, we call k>=2 a good base of n, if all digits of n base k are 1. Now given a str ...

  8. Oracle synonym 同义词

    Oracle synonym 同义词 1.Oracle synonym 同义词是数据库当前用户通过给另外一个用户的对象创建一个别名,然后可以通过对别名进行查询和操作,等价于直接操作该数据库对象. 2. ...

  9. Redis配置与安装

    Redis 是一个非关系型高性能的key-value数据库.在部分场合可以对关系数据库起到很好的补充作用.它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C, ...

  10. Java开发知识之Java的数字处理类Math类

    Java开发知识之Java的数字处理类Math类 一丶Java.text.DecimalFormat类与NumberFormat类 首先 Java.text.DecimalFormat指的是Decim ...