設計原則篇之一(單一職責)


 

        所謂設計原則,就是在設計時必須遵守的原則。就個人學習過程來看,主要有SOLIDDRY兩大類。那么首先說下SOLID原則。

   SOLID主要包括五種原則。單詞中每個字母都代表一種原則。這五種原則分別是:

SRP

The Single Responsibility Principle 

單一責任原則

OCP

The Open Closed Principle 

開放封閉原則

LSP

The Liskov Substitution Principle

里氏替換原則

DIP

The Dependency Inversion Principle

依賴倒置原則

ISP

The Interface Segregation Principle

接口分離原則

單一職責原則(SRP

     解析:SRP被表述為”一個類應該有且只有一個變化的原因“,單一職責意味着每個類或者方法只做一件事情,該原則也是多數開發人員最容易理解但是也是最容易違反的一個原則。在ASP.NET MVC中,一個很好的例子,就是不同的顯示接口對應不同的控制器。例如,HomeController就只應包含主頁有關的操作,而ProductController應該只處理產品頁面的操作。

多功能與單變化

    對於單功能類來說,比較容易遵循SRP。例如:將繁體中文轉換為簡體中文的工具類。我們來看一個手機(Phone)類的例子,Phone具有2個功能:發短信,打電話。

1 public class Phone{
2 
3     public void Message() {}
4 
5 public void MakePhone() {…}
6 
7 }

 

 

我們先來考察一下Phone類的變化點,並將其分為兩類:

1.Phone類的內部細節變化,比如MessageMakePhone方法發生了變化;

2.Phone類整體性的變化,比如Phone類需要增加PlayMovie方法。這個Phone類具有多個變化點,不符合SRP

進一步抽象

    難道每個類都應該只有一個方法嗎?當然不是。我們可以將每個方法提取到抽象中。下面代碼是將方法提取到抽象中。

  

 1  public interface IMessage
 2 
 3    {
 4 
 5        void MessageMethod();
 6 
 7    }
 8 
 9    public class Message:IMessage
10 
11     {
12 
13         public void MessageMethod(){   }
14 
15 }
16 
17  
18 
19    public interface IMakePhone
20 
21    {
22 
23         void MakePhoneMethod();
24 
25    }
26 
27    public class MakePhone:IMakePhone
28 
29     {
30 
31         public void MakePhoneMethod()  { }
32 
33     }
34 
35  
36 
37    public class Phone
38 
39    {
40 
41        private IMessage message;
42 
43        public void MessageMethod()
44 
45        {
46 
47            message.MessageMethod();
48 
49        }
50 
51        private IMakePhone makePhone;
52 
53        public void MakePhoneMethod()
54 
55        {
56 
57            makePhone.MakePhoneMethod();
58 
59        }
60 
61    }

 

    上述方法將功能點抽取到單一的接口中,將變化封裝到了穩定的接口背后,這樣就避免了底層的變化傳導到高層。如果想更好的運用單一職責原則,就必須理解好C#編程中的抽象。

     當下,正是單一職責盛行的時代,每個人都專精於某一個模塊,需要多人協同合作,才能組成絢麗多彩的世界。代碼寫到一定程序,慢慢的我們就需要考慮一些設計原則,當然原則是以實際應用為基礎的。

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM