搬砖方法论:Single Responsibility Principle(单一职责原则又叫SRP原则)

本文主要是介绍搬砖方法论:Single Responsibility Principle(单一职责原则又叫SRP原则),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

差异的源头

前言:语言本身是一件非常不稳定的表达工具,这也是为什么我们在沟通中需要观察对方的表情、肢体动作、给予的隐喻、提供的图像来进一步确定对方想表达的意思,加之语言的使用者和接收者因文化、职业、经历等不确定因素的影响,又会造成相同的语句表达出不同含义,这让语言的精确性再次下降。

只有这些?

当我们用搜索引擎搜索 SRP原则或单一职责原则关键字,定义中使用频率最多的一句话就是:一个类应该只有一个发生变化的原因。

这不仅让读者陷入思索,其中所描述的原因到底是什么?是否可量化?

以量取胜

为了进一步解释这个"原因",我们对其定义丰富一下:

  • 一个类应该只有一个发生变化的原因。
  • 每一个类都应该对程序功能的一个部分负责,此时它应该封装。该模块、类或函数的所有服务都应该与该职责紧密结合。
  • 将因相同原因而发生变化的事物聚集在一起。分开由于不同原因而改变的事物。

以上的三条定义说的都是一件事:单一职责原则。
这也能看出,这个发生变化的"原因"是基于一个集合。如果每个函数只做一件事是一个机器的零件,那单一职责中的"职责"也就是所说的“原因”就是这些零件组合起来的功能。

确定单一

既然我们已经从概念上统一了职责到底是什么,那么下一步就是从量化的角度确定如何保证职责单一。

分为如下三步

  • 建模
  • 编码对应的类(笔者开始阶段常用伪代码代替)
  • 将对应的类拆分为多个类直到不能拆分

建模:可以理解为对应需求的梳理和拆分,最终抽象(总结)出这个职责核心是做什么的,要依赖于哪些其他的职责。

应用

我们可以举个例子来说明,我们要做一个菜单界面功能,一般我们会这么写

public class MenuPanel
{public MenuPanel(){var menuData = GetMenuData();SetMenuDataAndUpdate(menuData);}public string GetMenuData(){// do something...return default;}public void SetMenuDataAndUpdate(string temp){// do something...}
}

在这个MenuPanel类中负责显示Menu这个菜单界面,但是这个MenuPanel真的是仅仅负责显示吗?答案是否定的。

当得到策划需求的时候,可按照【确定单一】里面所说的3步骤进行如下操作

建模

  • 根据数据库的数据显示对应的菜单。
  • 数据方面需要:请求-验证-解析-整合-筛选等操作。相当于上述代码GetMenuData()函数。
  • UI方面需要:接收数据-数据分类填充-适配布局-注册响应事件等操作。相当于上述代码SetMenuDataAndUpdate()函数。
  • 将上面数据与UI进行衔接操作。相当于上述代码MenuPanel()

拆分对应的类直到不能再拆分

  • 数据处理一个类
  • UI显示一个类
  • 数据与UI衔接一个类

经过拆分后的代码

public class ServerData
{public string GetNeedData(){/** 请求 函数* 验证 函数* 解析 函数* 整合 函数* 筛选 函数*/return default;}}public class MenuPanel
{private string m_NeedData;public MenuPanel(string needData){m_NeedData = needData;}public void UpdateMenu(){// do something...}
}public class EnterMenuPanelCommand
{public void Excute(){var serverData = new ServerData();var needData = serverData.GetNeedData();//TODO:正常情况下不应该直接传入基本类型,应该传入对应的自定义类,为了示例简单暂且代替var menuPanel = new MenuPanel(needData);menuPanel.UpdateMenu();}
}

经过一系列的操作我们得到三个职责:数据处理、UI刷新、数据与UI衔接三个职责。这样每一个类当职责变化,即只有一个发生变化原因时,我们才需要更改对应的类。

总结

SRP原则并不是彻底消灭腐朽代码的银弹,它只是降低出现代码坏的味道的几率,提高代码整洁的系数。SRP原则是一个指导性建议,并非强制要求,也切勿生搬硬套。


更多文章详见主页:www.aihailan.com

这篇关于搬砖方法论:Single Responsibility Principle(单一职责原则又叫SRP原则)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/695365

相关文章

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少

PHP最长单一子串

<?php//方法一$s='abcccddddddcdefg';$max='';while($s!=''){$i=0; while($i<strlen($s) && $s[$i]==$s[0]) $i++;if ($i>strlen($max)){$max=substr($s,0,$i);} $s=substr($s,$i);}echo $m

水处理过滤器运行特性及选择原则浅谈

过滤属于流体的净化过程中不可缺的处理环节,主要用于去除流体中的颗粒物或其他悬浮物。水处理过滤器的原理是利用有孔介质,从流体中去除污染物,使流体达到所需的洁净度水平。         水处理过滤器的滤壁是有一定厚度的,也就是说过滤器材具有深度,以“弯曲通 道”的形式对去除污染物起到了辅助作用。过滤器是除去液体中少量固体颗粒的设备,当流体进入置有一定规格滤网的滤筒后,其杂质被阻挡,而

设计模式 -- 职责链模式(Chain of Responsibility Pattern)

1 问题引出 1.1 学校 OA 系统的采购审批项目 如果金额 小于等于 5000, 由教学主任审批 (0<=x<=5000)如果金额 小于等于 10000, 由院长审批 (5000<x<=10000)如果金额 小于等于 30000, 由副校长审批 (10000<x<=30000)如果金额 超过 30000 以上,有校长审批 ( 30000<x) 1.2 传统方式 传统方式是

数据治理方法论和实践小百科全书

什么是数据治理? 数据治理是指从使用零散数据变为使用统一数据、从具有很少或没有组织流程到企业范围内的综合数据管控、从数据混乱状况到数据井井有条的一个过程。 从范围来讲,数据治理涵盖了从前端业务系统、后端业务数据库再到业务终端的数据分析,从源头到终端再回到源头,形成的一个闭环负反馈系统。从目的来讲,数据治理就是要对数据的获取、处理和使用进行监督管理。 是以服务组织战略目标为基本原则,通过组织成员

193页PPT读懂《数字化转型方法论》,强烈建议收藏!

点击上方蓝色字体,选择“设为星标” 回复”面试“获取更多惊喜 国云CEO马晓东写了本《数字化转型方法论》的书,这篇文章是明东亮用PPT形式写成的一篇读书笔记,体系化程度是很好的,主要阐述了数字化转型八个方面的内容: 1、为何数字化转型 2、何时数字化转型 3、什么是数字化转型 4、是否该数字化转型 5、谁来负责数字化转型 6、如何数字化转型 7、数字化转型利器 8、数字化转型案例 有时间可以读

掌握 Redis 数据冗余:主从服务器的角色与职责

掌握 Redis 数据冗余:主从服务器的角色与职责 一 . 什么是主从复制1.1 主从复制是什么 ?1.2 什么是主从模式1.3 主从复制能够解决的问题 二 . 配置主从复制2.1 启动多个 redis-server2.2 配置主从模式2.3 查看主从结构信息2.4 断开 / 临时修改主从结构 三 . 主从复制的补充内容3.1 安全性、只读、传输延时安全性只读传输延迟 3.2 主从复制的拓扑

[LeetCode] 137. Single Number II

题:https://leetcode.com/problems/single-number-ii/ 题目大意 给定array,其中有一个元素只出现了1次,其他元素都出现了3次。 思路 求和 减去 (set(array)*3 - array)/2 作为答案。 class Solution {public int singleNumber(int[] nums) {Set<Long> se

重写equals和hashCode的原则规范

当符合以下条件时不需要重写equals方法:     1.     一个类的每一个实例本质上都是唯一的。     2.     不关心一个类是否提供了“逻辑相等”的测试功能     3.     超类已经改写了equals方法,并且从超类继承过来的行为对于子类也是合适的。     4.     一个类时私有的或者是package私有的,并且可以确定它的equals方法永远不会被调用。(这

职场关系课:职场上的基本原则(安全原则、进步原则、收益原则、逃生舱原则)

文章目录 引言安全原则进步原则收益原则逃生舱原则 引言 职场上的王者,身体里都应该有三个灵魂: 一个文臣,谨小慎微,考虑风险; 一个武将,积极努力,谋求胜利; 一个商人,精打细算,心中有数。 安全原则 工作安全:保住自己的工作和位置信用安全:保住个人的信用,如果领导看到了你的信用受损,你和领导的关系可能会持续恶化。人身安全:有的时候你会遇到偏执的人,要及时和