单一职责原则--设计模式系列

定义

  一个类只负责一项职责

 

职责扩散

  什么叫职责扩散,就是职责再进行细化,就拿公司来说,好比客户的需求,需求是不断变化的,而且存在极大的不确定性,说不定哪天上司找到你要重新细化某个需求

  所以最好在职责扩散到我们无法控制的程度之前,立刻对代码进行重构

 

栗子

  我们先下面这段代码:

class Animal:def __init__(self,name):self.name = namedef breathe(self):print('%s用肺呼吸'%self.name)niu = Animal('小奶牛')
zhu = Animal('小白猪')niu.breathe()
zhu.breathe()

   我们很快就能从上面代码中发现一些逻辑上的错误,因为不是所有的动物都是用肺呼吸,有的使用腮呼吸的,应该将Animal类细分为陆生动物类Terrestrial,水生动物类Aquatic,代码如下:

class Animal:def __init__(self,name):self.name = nameclass Terrestrial(Animal):def breathe(self):print('%s 用肺呼吸'%self.name)class Aquatic(Animal):def breathe(self):print('%s 用腮呼吸'%self.name)c = Terrestrial('小花猫')
c.breathe()fish = Aquatic('美人鱼')
fish.breathe()

   我们看到上面代码的实现就是动物类分出两类,并把呼吸的方法写入的派生类里,好!这样做是没问题的,那看看下面这段代码:

class BreatheBehavior:def breathe(self):passclass LungBreathe(BreatheBehavior):def breathe(self):print('用肺呼吸')class CheekBreathe(BreatheBehavior):def breathe(self):print('用腮呼吸')class Animal:def __init__(self,name,breatheP):self.name = nameself.BreatheParam = breathePdef performBreathe(self):self.BreatheParam.breathe()class Terrestrial(Animal):def __init__(self,name,breatheP=LungBreathe()):super(Terrestrial,self).__init__(name,breatheP)class Aquatic(Animal):def __init__(self,name,breatheP=CheekBreathe()):super(Aquatic,self).__init__(name,breatheP)c = Terrestrial('小花猫')
c.performBreathe()fish = Aquatic('美人鱼')
fish.performBreathe()

   我们发现第二种方式,则像是用接口的形式实现了某个行为的类化,你可能会想,第二种方法的代码实现明显长的多,我为什么要用第二种方式。

  在今天的这个例子,毫无疑问是第一方法简单,那我们先来看看用单一职责原则的目的吧:

  • 目的
  1. 可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多
  2. 提高类的可读性,提高程序的可维护性
  3. 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响
  4. 单一职责原则同时也适用于模块化的程序设计

  好!所以单一职责的核心无非就是降低复杂度和提高可读性以及可扩展性,假如你把要动物的种类细化再细化,按照第一种方法--你是不是要在派生类重写多个呼吸方法?但是动物的呼吸方式无非就是这几种,所以第二种方法更适合复杂的场合,所以每种方法因场景而异,自己把握!

 

                               欢迎大家对我的博客内容提出质疑和提问!谢谢

 

                                                                             笔者:拍省先生 

转载于:https://www.cnblogs.com/xinsiwei18/p/5699599.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

淘宝网的技术发展史(一)——个人网站时代

《天下网商经理人》十月刊开始将连载系列文章《淘宝网的技术发展史》,为读者描述淘宝网在整个发展过程中,所有的主动和被动的技术变革的前因后果。 文/淘宝技术大学培训专家 子柳 前言 11月11日,这个棍子最多的日子被网民自我调侃变成了一个…

linux之彻底卸载mysql

1 问题 在centos系统下彻底卸载mysql 2 操作方式 1)、查看mysql的信息 rpm -qa | grep -i mysql mysql57-community-release-el7-10.noarch mysql-errmsg-8.0.17-3.module_el8.0.0+181+899d6349.x86_64 mysql-8.0.17-3.module_el8.0.0+181+899d6349.x86_64 mysql-server-8.…

使用 Vscode 编写 HTML 文档竟然可以自动写代码(2)

作者简介 作者名:1_bit 简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者。15-16年曾在网上直播,带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息,迷茫的你会找到答案。 目录 HTML基…

甘肃省事业单位公考招聘考试权威复习资料---GIS专业全真模拟题(一)

一、单选 1. 以下那个可以从像元级别、特征级别进行( )。 A.增强 B.锐化 C.重采样 D.裁剪 2. 1:10000比例尺地形图的格网大小是( )。 A.30m B.100m C.10m D.5m 3. 电子地图中加载矢量数据属于( &…

为什么 Docker 和 Kubernetes 是用 Go 写的而不是 C# ?

这是 Reddit 平台上面这几天一篇比较热门的帖子, 非常有意思,本文我列出了几个高赞的回答。👦 HahahahahaSoFunny为什么 Docker 和 Kubernetes 工具是用 Go 写的而不是 C#?总所周知,现在开发人员使用的很多新工具大多是用 Go 写的…

打造最舒适的webview调试环境

你在做移动web开发的时候是不是只是在Chrome下开启移动模式,然后就啪啪啪闷头敲代码了?如果你平时只是做做宣传页,Chrome的移动模式可能就能满足你。但是现在越来越多的应用采用Hybrid的开发方式,这样的话就可能在web页面上调用we…

淘宝网的技术发展史(二) ——Oracle替换MySQL

本文是《淘宝网的技术发展史》系列连载文的第二篇,在告别个人网站时代后,淘宝网的技术发展迎来了由Oracle开启的第二个时代。文/淘宝技术大学培训专家 子柳MySQL撑不住了 淘宝网作为个人网站发展的时间其实并不长,由于它太引人注目了&#xf…

数据结构——不相交集(并查集)

目的:解决等价问题。 表示方法:森林,底层实现用数组 主要操作:find()、union() 优化手段: ①find()时路径压缩 ②union()时按规模合并、按树高合并(依据情况而定) Java实现: class D…

Android之抓取adb logcat全日志后怎么过滤掉只包含当前app进程的日志(一般抓启动app奔溃日志)

1 、问题 有时候我们启动APP的时候,APP奔溃,在android studio里面日志可能冲掉,或者是云平台的手机安装的app,根本就没有android stduio,那我们用什么办法快速知道启动奔溃日志呢? 2、解决办法 我们先需要…

一个基础的 HTML 文档有哪些标签?(3)

作者简介 作者名:1_bit 简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者。15-16年曾在网上直播,带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息,迷茫的你会找到答案。 目录 HTML基…

考研:中国科学院地理所历年GIS研究生入学考试真题汇总

中科院地理所1997年GIS研究生入学试题 一、名词解释 1.拓扑关系 2.缓冲分析 3.关系数据模型 4.空间叠加 二、简答题 1、GIS的主要功能略 2、企业GIS系统的特色 三、问答题(选2) 1、GIS基本组成与主要应用领域 2、地理科学数据集成与管…

能上架App的GooglePlay开发者账号获取流程

googleplay 开发者账号申请流程 接到公司号召,要让我们的app走向世界,上架GooglePlay,都说天朝的Android 程序员是折翼的天使,猛然发现写了做么多年的Android,竟然不知道怎么成为GooglePlay开发者。 以前尝试过&#x…

如何让 ASP.NET Core 支持绑定查询字符串中的数组(2)

前言上回说到,我们实现了IntArrayModelBinder,可以让 ASP.NET Core 绑定查询字符串中的数组。但是必须显示指定ModelBinder:public string Get([FromQuery][ModelBinder(BinderType typeof(IntArrayModelBinder))] int[] values)而官方提供的…

hdu 3530 Subsequence

/* 开始以为是二分...后来发现丫不单调... */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 1000010 using namespace std; int n,l,r,ans,tmin[maxn],tmax[maxn],a[maxn]; int qmin[maxn],qmax[maxn],headmin,tailmin,headmax,tai…

FirstLetterUtil

package cn.edu.hbcf.common.utils;public class FirstLetterUtil {private static int BEGIN 45217;private static int END 63486;// 按照声母表示&#xff0c;这个表是在GB2312中的出现的第一个汉字&#xff0c;也就是说“啊”是代表首字母a的第一个汉字。// i, u, v都不做…

淘宝网的技术发展史(三)——分布式时代

本文是《淘宝网的技术发展史》系列连载文的第三篇。在系统发展的过程中&#xff0c;架构师的眼光至关重要&#xff0c;作为程序员&#xff0c;把功能实现即可&#xff1b;但作为架构师&#xff0c;要考虑系统的扩展性、复用性&#xff0c;这种敏锐的感觉&#xff0c;有人说是一…

Flutter提示之Navigator operation requested with a context that does not include a Navigator.

1 、问题 用Flutter写了页面跳转&#xff0c;提示错误如下 Navigator operation requested with a context that does not include a Navigator. 2 、我的代码 void main() {runApp(MyApp1()); }class MyApp1 extends StatelessWidget {overrideWidget build(BuildContext c…

《地理信息系统概论》课后习题全部答案_黄杏元

第一章 地理信息系统导论 1、什么是地理信息系统(GIS)?它与一般计算机应用系统有哪些异同点? 答:地理信息系统:是由计算机硬件、软件和不同的方法组成的系统,该系统设计支持空间数据的采集、管理、处理、分析、建模和显示,以便解决复杂的规划和管理问题。 GIS脱胎于…

你知道出现“乱码”的原因是什么吗?(4)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

Android应用程序线程消息循环模型分析(4)

接下来我们再看看应用程序的配置文件AndroidManifest.xml&#xff1a;<?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android" package"shy.luo.counter" andr…