C#面向?qū)ο笤O(shè)計原則之單一職責(zé)原則
單一職責(zé)原則(SRP)
定義:系統(tǒng)中的每一個類都應(yīng)該只有一個職責(zé)。
好處:高內(nèi)聚、低耦合。
解釋說明:
單一職責(zé)也就是說我們應(yīng)該讓一個類或一個對象只做一件事情,每個類所要關(guān)注的就是自己要完成的職責(zé)是什么,能夠引起這個類變化的原因也應(yīng)該只有一個,這也是后面提到的所有的設(shè)計模式都會遵守的一個原則。
高內(nèi)聚:先按照面向?qū)ο蟮姆庋b特性來理解,封裝也就是我們說的,應(yīng)該把一個類或?qū)ο笏邢嚓P(guān)的屬性、方法、行為放到一起,放到一個類中,這樣就實現(xiàn)了一個封裝的特性。那么內(nèi)聚,就是一個類里面應(yīng)該包含它所有的屬性和行為。封裝就是內(nèi)聚的一種表現(xiàn)方式。高內(nèi)聚是指我們一個類的屬性和行為應(yīng)該和這個類非常緊密,我們才把它放到這個類里面,反之我們就不應(yīng)該把這個屬性或行為放到這個類里面。
低耦合:內(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 單一職責(zé)_SRP_ { /// <summary> /// 會計類 /// </summary> public class Accountant { /// <summary> /// 計算工資 /// </summary> public void CalculateSalary() { // 計算工資 } /// <summary> /// 存儲數(shù)據(jù) /// </summary> public void Store() { // 存儲數(shù)據(jù) } } }
在上面的代碼中定義了一個會計類,類里面有兩個方法:計算工資和存儲數(shù)據(jù)。一個類里面有兩個職責(zé),并且引起這個類變化的原因有很多種:一個是計算工資的方法的參數(shù)的變化會影響類的變化,存儲數(shù)據(jù)的方法的變化也會影響類的變化,沒有很好的實現(xiàn)單一職責(zé)原則,應(yīng)該把計算工資和存儲數(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 單一職責(zé)_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ù)庫服務(wù)沒有開啟,那么數(shù)據(jù)庫鏈接可能就打不開。執(zhí)行增刪改查主要和SQL語句有關(guān)系。最理想的設(shè)計應(yīng)該是把與數(shù)據(jù)鏈接有關(guān)的操作封裝成一個類,把執(zhí)行增刪改查的操作封裝到另外一個類中。
在上面的兩個錯誤案例中,一個類都實現(xiàn)了兩個職責(zé),而不是一個職責(zé),不符合單一職責(zé)的原則。這樣設(shè)計類不是最完美的,建議按照單一職責(zé)的原則細分成兩個類,這樣就能實現(xiàn)高內(nèi)聚低耦合。
代碼下載鏈接:點此下載
到此這篇關(guān)于C#面向?qū)ο笤O(shè)計單一職責(zé)原則的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#利用PrintDocument定制打印單據(jù)的小例子
這篇文章主要給大家介紹了關(guān)于C#利用PrintDocument定制打印單據(jù)的小例子,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05提高C# StringBuilder操作性能優(yōu)化的方法
本篇文章主要介紹使用C# StringBuilder 的項目實踐,用于減少內(nèi)存分配,提高字符串操作的性能。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11解決C#中WebBrowser的DocumentCompleted事件不執(zhí)行的實現(xiàn)方法
本篇文章是對C#中WebBrowser的DocumentCompleted事件不執(zhí)行解決方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05