單一職責原則--設計模式系列

定義

  一個類只負責一項職責

?

職責擴散

  什么叫職責擴散,就是職責再進行細化,就拿公司來說,好比客戶的需求,需求是不斷變化的,而且存在極大的不確定性,說不定哪天上司找到你要重新細化某個需求

  所以最好在職責擴散到我們無法控制的程度之前,立刻對代碼進行重構

?

栗子

  我們先下面這段代碼:

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.pswp.cn/news/286889.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286889.shtml
英文地址,請注明出處:http://en.pswp.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…