设计模式六大原则: 一个萝卜一个坑 -- 单一职责原则

本文主要是介绍设计模式六大原则: 一个萝卜一个坑 -- 单一职责原则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

形形色色的代码接触多了,越发意识到 面向对象 这个被人说烂却鲜有用好的概念的重要性。之前看了《大话设计模式》也只是匆匆一瞥,没有敲代码或者记博客,这次连着《Android 源码设计模式解析与实战》一起学习,总结记录下来。

设计模式流传江湖许久,据说有 23 式,而万物归宗皆有其律,这些繁杂的模式总结出来就是如下 6 大原则。

  1. 单一职责原则
  2. 开放封闭原则
  3. 里氏代换原则
  4. 依赖倒置原则
  5. 接口分离原则
  6. 迪米特原则

在氛围好、发展快的公司、部门,每项工作都有对应的人来完成,你去了就是流水线上的一部分,只要努力做好自己的工作,有需要了调下面提供的接口,写好了再把接口暴露给别人,哪怕你身体不舒服请假了,你的这块东西也很容易找到别人替换。
然而在另外一些公司、部门,由于资金、规模或者管理的问题,往往一人顶 N 个人使,两天一需求、一周一迭代,人一累了免疫力下降,容易写 bug 不说还容易得病,结果一个员工得病了或者辞职了,这个项目就进行不下去了。

对比上述两种,一个萝卜一个坑还是优势很大的,毕竟软件开发过程就和创业公司的人力一样,会不停的有变动,一旦把鸡蛋都放到一个篮子里,容易全军覆没。

所以这时就用到了 单一职责 SRP(Single Responsibility Principle)

从名字就可以看出,单一职责强调的是接口、类、方法的“专一性”。这种“专一性”在我们编码时怎么体现呢,那就是尽可能的让你的类、方法、接口的功能原子化、简单化,举个栗子:

假设你承包了一个小区的物业,小区户主很多,每天有大量的辣鸡产生,现在需要几个人来负责收拾物业的辣鸡,打造五星级清洁物业。你参考这种情况写个物业清洁类。

物业清洁需要做的事很多,比如楼道清洁、马路清洁、垃圾箱拜访清洁、垃圾外送、定时杀毒等等。一不小心你写的类可能就是这样:

这里写图片描述

长长的类啊,看着就头疼,仔细看会发现,其中有些职责还有关联,比如保洁员的工作进行后,清运员才有垃圾可以运输,如果保洁员干一半罢工了,清运员的工作也得耽搁。看着就乱,还容易出错。

我们知道,效率最高的工作方法就是职责分清,你干你的,我干我的,只有在需要交流的时候把我需要的东西给我就行,我不用管你怎么做的。同样,代码最干净的写法就是把那些又长又复杂的类、方法都拆开,按功能、模块分成一个个小组织。然后互相留个接口就好了。这样不管你内部怎么变动,只要能给我提供功能就 ok 了。这就是单一职责的意思。

回到之前的问题,我们采用单一职责原则,把物业清洁进一步细分,分为管理、保洁、清运三部分,然后每部分要做哪些任务都列个一二三四:

这里写图片描述

这样分成三个模块类,每个类中又有不同的职责方法,看起来清爽干净。实际工作时,也不会由于脏在一起不好分离、不好更换。

工程师可以不断审视自己的代码,根据具体的业务、功能对类、方法进行拆分,这是优化代码的第一步。

如果一个类承担的责任过多,就等于把这些责任的风险也承担了过来。其中任意 一个的变化都可能对整体造成影响。应该找出变的和不变的,进行分离。
软件设计真正要做得内容之一就是发现职责,并把这些职责相分离(ASD)

《大话设计模式》

这篇关于设计模式六大原则: 一个萝卜一个坑 -- 单一职责原则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

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

设计模式之工厂模式(通俗易懂--代码辅助理解【Java版】)

文章目录 1、工厂模式概述1)特点:2)主要角色:3)工作流程:4)优点5)缺点6)适用场景 2、简单工厂模式(静态工厂模式)1) 在简单工厂模式中,有三个主要角色:2) 简单工厂模式的优点包括:3) 简单工厂模式也有一些限制和考虑因素:4) 简单工厂模式适用场景:5) 简单工厂UML类图:6) 代码示例: 3、工厂方法模式1) 在工厂方法模式中,有4个主要角色:2) 工厂方法模式的工作流程

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一

JavaScript正则表达式六大利器:`test`、`exec`、`match`、`matchAll`、`search`与`replace`详解及对比

在JavaScript中,正则表达式(Regular Expression)是一种用于文本搜索、替换、匹配和验证的强大工具。本文将深入解析与正则表达式相关的几个主要执行方法:test、exec、match、matchAll、search和replace,并对它们进行对比,帮助开发者更好地理解这些方法的使用场景和差异。 正则表达式基础 在深入解析方法之前,先简要回顾一下正则表达式的基础知识。正则

漫谈设计模式 [12]:模板方法模式

引导性开场 菜鸟:老大,我最近在做一个项目,遇到了点麻烦。我们有很多相似的操作流程,但每个流程的细节又有些不同。我写了很多重复的代码,感觉很乱。你有啥好办法吗? 老鸟:嗯,听起来你遇到了典型的代码复用和维护问题。你有没有听说过“模板方法模式”? 菜鸟:模板方法模式?没听过。这是什么? 老鸟:简单来说,模板方法模式让你在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中。这样,你可

漫谈设计模式 [9]:外观模式

引导性开场 菜鸟:老鸟,我最近在做一个项目,感觉代码越来越复杂,我都快看不懂了。尤其是有好几个子系统,它们之间的调用关系让我头疼。 老鸟:复杂的代码确实让人头疼。你有没有考虑过使用设计模式来简化你的代码结构? 菜鸟:设计模式?我听说过一些,但不太了解。你觉得我应该用哪个模式呢? 老鸟:听起来你的问题可能适合用**外观模式(Facade Pattern)**来解决。我们可以一起探讨一下。

设计模式大全和详解,含Python代码例子

若有不理解,可以问一下这几个免费的AI网站 https://ai-to.cn/chathttp://m6z.cn/6arKdNhttp://m6z.cn/6b1quhhttp://m6z.cn/6wVAQGhttp://m6z.cn/63vlPw 下面是设计模式的简要介绍和 Python 代码示例,涵盖主要的创建型、结构型和行为型模式。 一、创建型模式 1. 单例模式 (Singleton

漫谈设计模式 [6]:适配器模式

引导性开场 菜鸟:老鸟,我最近在项目中遇到一个问题,我们的系统需要集成一个新的第三方库,但这个库的接口和我们现有的代码完全不兼容。我该怎么办? 老鸟:这是个常见的问题,很多开发者都会遇到这种情况。你有没有听说过适配器模式? 菜鸟:适配器模式?没有,能详细说说吗? 老鸟:当然可以!这就是我们今天要讨论的主题。适配器模式是一个设计模式,可以帮助我们解决你现在遇到的问题。 渐进式介绍概念 老