C#面向?qū)ο笤O(shè)計(jì)原則之單一職責(zé)原則
單一職責(zé)原則(SRP)
定義:系統(tǒng)中的每一個(gè)類都應(yīng)該只有一個(gè)職責(zé)。
好處:高內(nèi)聚、低耦合。
解釋說明:
單一職責(zé)也就是說我們應(yīng)該讓一個(gè)類或一個(gè)對(duì)象只做一件事情,每個(gè)類所要關(guān)注的就是自己要完成的職責(zé)是什么,能夠引起這個(gè)類變化的原因也應(yīng)該只有一個(gè),這也是后面提到的所有的設(shè)計(jì)模式都會(huì)遵守的一個(gè)原則。
高內(nèi)聚:先按照面向?qū)ο蟮姆庋b特性來理解,封裝也就是我們說的,應(yīng)該把一個(gè)類或?qū)ο笏邢嚓P(guān)的屬性、方法、行為放到一起,放到一個(gè)類中,這樣就實(shí)現(xiàn)了一個(gè)封裝的特性。那么內(nèi)聚,就是一個(gè)類里面應(yīng)該包含它所有的屬性和行為。封裝就是內(nèi)聚的一種表現(xiàn)方式。高內(nèi)聚是指我們一個(gè)類的屬性和行為應(yīng)該和這個(gè)類非常緊密,我們才把它放到這個(gè)類里面,反之我們就不應(yīng)該把這個(gè)屬性或行為放到這個(gè)類里面。
低耦合:內(nèi)聚是指類的內(nèi)部,耦合是指類與類之間或者模塊之間相互的聯(lián)系,這種聯(lián)系、關(guān)系叫耦合,衡量這種耦合的程度,可以用耦合度來表示,耦合度越高說明類與類之間的聯(lián)系是越緊密的,也就是相互之間的獨(dú)立性比較差,也就是一個(gè)類必須依靠另外一個(gè)類才有意義,才能存在。耦合度越低,越容易重用,類也比較靈活。
錯(cuò)誤案例1:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 單一職責(zé)_SRP_
{
/// <summary>
/// 會(huì)計(jì)類
/// </summary>
public class Accountant
{
/// <summary>
/// 計(jì)算工資
/// </summary>
public void CalculateSalary()
{
// 計(jì)算工資
}
/// <summary>
/// 存儲(chǔ)數(shù)據(jù)
/// </summary>
public void Store()
{
// 存儲(chǔ)數(shù)據(jù)
}
}
}在上面的代碼中定義了一個(gè)會(huì)計(jì)類,類里面有兩個(gè)方法:計(jì)算工資和存儲(chǔ)數(shù)據(jù)。一個(gè)類里面有兩個(gè)職責(zé),并且引起這個(gè)類變化的原因有很多種:一個(gè)是計(jì)算工資的方法的參數(shù)的變化會(huì)影響類的變化,存儲(chǔ)數(shù)據(jù)的方法的變化也會(huì)影響類的變化,沒有很好的實(shí)現(xiàn)單一職責(zé)原則,應(yīng)該把計(jì)算工資和存儲(chǔ)數(shù)據(jù)分開。
錯(cuò)誤案例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);
}
}上面的代碼中定義了一個(gè)數(shù)據(jù)訪問類,里面有兩個(gè)方法:數(shù)據(jù)鏈接、執(zhí)行增刪改查的操作。數(shù)據(jù)鏈接一般和配置文件關(guān)聯(lián)比較大。如果配置文件沒有配置好、或者數(shù)據(jù)庫服務(wù)沒有開啟,那么數(shù)據(jù)庫鏈接可能就打不開。執(zhí)行增刪改查主要和SQL語句有關(guān)系。最理想的設(shè)計(jì)應(yīng)該是把與數(shù)據(jù)鏈接有關(guān)的操作封裝成一個(gè)類,把執(zhí)行增刪改查的操作封裝到另外一個(gè)類中。
在上面的兩個(gè)錯(cuò)誤案例中,一個(gè)類都實(shí)現(xiàn)了兩個(gè)職責(zé),而不是一個(gè)職責(zé),不符合單一職責(zé)的原則。這樣設(shè)計(jì)類不是最完美的,建議按照單一職責(zé)的原則細(xì)分成兩個(gè)類,這樣就能實(shí)現(xiàn)高內(nèi)聚低耦合。
代碼下載鏈接:點(diǎn)此下載
到此這篇關(guān)于C#面向?qū)ο笤O(shè)計(jì)單一職責(zé)原則的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C#實(shí)現(xiàn)六大設(shè)計(jì)原則之依賴倒置原則
- C#面向?qū)ο笤O(shè)計(jì)原則之組合/聚合復(fù)用原則
- C#面向?qū)ο笤O(shè)計(jì)原則之接口隔離原則
- C#面向?qū)ο笤O(shè)計(jì)原則之里氏替換原則
- C#面向?qū)ο笤O(shè)計(jì)原則之開閉原則
- C#實(shí)現(xiàn)六大設(shè)計(jì)原則之迪米特法則
- C#實(shí)現(xiàn)六大設(shè)計(jì)原則之接口隔離原則
- C#實(shí)現(xiàn)六大設(shè)計(jì)原則之里氏替換原則
- C#實(shí)現(xiàn)六大設(shè)計(jì)原則之單一職責(zé)原則
- 淺談C#六大設(shè)計(jì)原則
- C#編程之依賴倒置原則DIP
相關(guān)文章
C#中ListView控件實(shí)現(xiàn)窗體代碼
這篇文章主要介紹了C#中ListView控件實(shí)現(xiàn)窗體的核心代碼,非常不錯(cuò),具有參考借鑒價(jià)值,對(duì)c#listview相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-08-08
C#組件系列 你值得擁有的一款Excel處理神器Spire.XLS
又一款Excel處理神器Spire.XLS,這篇文章主要為大家詳細(xì)介紹了第三方組件Spire.XLS,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
C#原型模式之如何通過克隆對(duì)象來優(yōu)化創(chuàng)建過程
原型模式是一種創(chuàng)建型設(shè)計(jì)模式,通過克隆現(xiàn)有對(duì)象來創(chuàng)建新對(duì)象,避免重復(fù)的創(chuàng)建成本和復(fù)雜的初始化過程,它適用于對(duì)象創(chuàng)建過程復(fù)雜、需要大量相似對(duì)象或避免重復(fù)初始化的場(chǎng)景,本文介紹C#原型模式之如何通過克隆對(duì)象來優(yōu)化創(chuàng)建過程,感興趣的朋友一起看看吧2025-03-03
C#滑動(dòng)驗(yàn)證碼拼圖驗(yàn)證功能實(shí)現(xiàn)(SlideCaptcha)
目前網(wǎng)站上的驗(yàn)證碼機(jī)制可謂是五花八門,有簡(jiǎn)單的數(shù)字驗(yàn)證,有摻雜了字母和文字的混淆驗(yàn)證,還有通過滑塊進(jìn)行的拼圖驗(yàn)證,下面這篇文章主要給大家介紹了關(guān)于C#滑動(dòng)驗(yàn)證碼拼圖驗(yàn)證功能的實(shí)現(xiàn)方法,需要的朋友可以參考下2022-04-04

