1. 程式人生 > >面向對象設計原則一:單一職責原則(SRP)

面向對象設計原則一:單一職責原則(SRP)

能夠 實現 update 之間 關註 linq 好處 相互 並且

單一職責原則(SRP)

定義:系統中的每一個類都應該只有一個職責。

好處:高內聚、低耦合。

解釋說明:

單一職責也就是說我們應該讓一個類或一個對象只做一件事情,每個類所要關註的就是自己要完成的職責是什麽,能夠引起這個類變化的原因也應該只有一個,這也是後面提到的所有的設計模式都會遵守的一個原則。

高內聚:先按照面向對象的封裝特性來理解,封裝也就是我們說的,應該把一個類或對象它所有相關的屬性、方法、行為放到一起,放到一個類中,這樣就實現了一個封裝的特性。那麽內聚,就是一個類裏面應該包含它所有的屬性和行為。封裝就是內聚的一種表現方式。高內聚是指我們一個類的屬性和行為應該和這個類非常緊密,我們才把它放到這個類裏面,反之我們就不應該把這個屬性或行為放到這個類裏面。

低耦合:內聚是指類的內部,耦合是指類與類之間或者模塊之間相互的聯系,這種聯系、關系叫耦合,衡量這種耦合的程度,可以用耦合度來表示,耦合度越高說明類與類之間的聯系是越緊密的,也就是相互之間的獨立性比較差,也就是一個類必須依靠另外一個類才有意義,才能存在。耦合度越低,越容易重用,類也比較靈活。

錯誤案例1:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7
namespace 單一職責_SRP_ 8 { 9 /// <summary> 10 /// 會計類 11 /// </summary> 12 public class Accountant 13 { 14 /// <summary> 15 /// 計算工資 16 /// </summary> 17 public void CalculateSalary() 18 { 19 // 計算工資 20 } 21 22 /// <summary>
23 /// 存儲數據 24 /// </summary> 25 public void Store() 26 { 27 // 存儲數據 28 } 29 } 30 }

在上面的代碼中定義了一個會計類,類裏面有兩個方法:計算工資和存儲數據。一個類裏面有兩個職責,並且引起這個類變化的原因有很多種:一個是計算工資的方法的參數的變化會影響類的變化,存儲數據的方法的變化也會影響類的變化,沒有很好的實現單一職責原則,應該把計算工資和存儲數據分開。

錯誤案例2:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Data.SqlClient;
 7 using System.Data;
 8 
 9 namespace 單一職責_SRP_
10 {
11     public interface IDao
12     {
13         // 獲取數據庫連接
14         SqlConnection GetConnection(); 
15         // 關閉連接
16         void Close();
17         // 執行添加、更新、刪除操作
18         void ExecuteUpdate(string strSQL);
19         // 執行查詢操作
20         DataSet ExecuteQuery(String strSQL);
21     }
22 }

上面的代碼中定義了一個數據訪問類,裏面有兩個方法:數據鏈接、執行增刪改查的操作。數據鏈接一般和配置文件關聯比較大。如果配置文件沒有配置好、或者數據庫服務沒有開啟,那麽數據庫鏈接可能就打不開。執行增刪改查主要和SQL語句有關系。最理想的設計應該是把與數據鏈接有關的操作封裝成一個類,把執行增刪改查的操作封裝到另外一個類中。

在上面的兩個錯誤案例中,一個類都實現了兩個職責,而不是一個職責,不符合單一職責的原則。這樣設計類不是最完美的,建議按照單一職責的原則細分成兩個類,這樣就能實現高內聚低耦合。

面向對象設計原則一:單一職責原則(SRP)