網(wǎng)站首頁 編程語言 正文
單一職責原則(SRP)
定義:系統(tǒng)中的每一個類都應該只有一個職責。
好處:高內(nèi)聚、低耦合。
解釋說明:
單一職責也就是說我們應該讓一個類或一個對象只做一件事情,每個類所要關(guān)注的就是自己要完成的職責是什么,能夠引起這個類變化的原因也應該只有一個,這也是后面提到的所有的設(shè)計模式都會遵守的一個原則。
高內(nèi)聚:先按照面向?qū)ο蟮姆庋b特性來理解,封裝也就是我們說的,應該把一個類或?qū)ο笏邢嚓P(guān)的屬性、方法、行為放到一起,放到一個類中,這樣就實現(xiàn)了一個封裝的特性。那么內(nèi)聚,就是一個類里面應該包含它所有的屬性和行為。封裝就是內(nèi)聚的一種表現(xiàn)方式。高內(nèi)聚是指我們一個類的屬性和行為應該和這個類非常緊密,我們才把它放到這個類里面,反之我們就不應該把這個屬性或行為放到這個類里面。
低耦合:內(nèi)聚是指類的內(nèi)部,耦合是指類與類之間或者模塊之間相互的聯(lián)系,這種聯(lián)系、關(guān)系叫耦合,衡量這種耦合的程度,可以用耦合度來表示,耦合度越高說明類與類之間的聯(lián)系是越緊密的,也就是相互之間的獨立性比較差,也就是一個類必須依靠另外一個類才有意義,才能存在。耦合度越低,越容易重用,類也比較靈活。
錯誤案例1:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 單一職責_SRP_ { ////// 會計類 /// public class Accountant { ////// 計算工資 /// public void CalculateSalary() { // 計算工資 } ////// 存儲數(shù)據(jù) /// public void Store() { // 存儲數(shù)據(jù) } } }
在上面的代碼中定義了一個會計類,類里面有兩個方法:計算工資和存儲數(shù)據(jù)。一個類里面有兩個職責,并且引起這個類變化的原因有很多種:一個是計算工資的方法的參數(shù)的變化會影響類的變化,存儲數(shù)據(jù)的方法的變化也會影響類的變化,沒有很好的實現(xiàn)單一職責原則,應該把計算工資和存儲數(shù)據(jù)分開。
錯誤案例2:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Data; namespace 單一職責_SRP_ { public interface IDao { // 獲取數(shù)據(jù)庫連接 SqlConnection GetConnection(); // 關(guān)閉連接 void Close(); // 執(zhí)行添加、更新、刪除操作 void ExecuteUpdate(string strSQL); // 執(zhí)行查詢操作 DataSet ExecuteQuery(String strSQL); } }
上面的代碼中定義了一個數(shù)據(jù)訪問類,里面有兩個方法:數(shù)據(jù)鏈接、執(zhí)行增刪改查的操作。數(shù)據(jù)鏈接一般和配置文件關(guān)聯(lián)比較大。如果配置文件沒有配置好、或者數(shù)據(jù)庫服務沒有開啟,那么數(shù)據(jù)庫鏈接可能就打不開。執(zhí)行增刪改查主要和SQL語句有關(guān)系。最理想的設(shè)計應該是把與數(shù)據(jù)鏈接有關(guān)的操作封裝成一個類,把執(zhí)行增刪改查的操作封裝到另外一個類中。
在上面的兩個錯誤案例中,一個類都實現(xiàn)了兩個職責,而不是一個職責,不符合單一職責的原則。這樣設(shè)計類不是最完美的,建議按照單一職責的原則細分成兩個類,這樣就能實現(xiàn)高內(nèi)聚低耦合。
代碼下載鏈接:點此下載
原文鏈接:https://www.cnblogs.com/dotnet261010/p/7349828.html
相關(guān)推薦
- 2022-05-18 C語言自定義類型超詳細梳理之結(jié)構(gòu)體?枚舉?聯(lián)合體_C 語言
- 2022-05-14 Python實現(xiàn)簡單的圖書管理系統(tǒng)_python
- 2022-02-15 Linux系統(tǒng)設(shè)置tomcat開機自啟介紹_Linux
- 2024-01-31 深入理解Python中的 `yield` 和 `yield from`
- 2023-04-04 numpy中的norm()函數(shù)求范數(shù)實例_python
- 2023-02-15 docker刪除拉取的鏡像釋放內(nèi)存的操作方法_docker
- 2022-04-23 一起來了解python的基本輸入和輸出_python
- 2022-04-07 Kotlin原理詳析之拓展函數(shù)_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支