前言
面向對象有人分為五大原則,分別為單一職責原則、開放封閉原則、依賴倒置原則、接口隔離原則、里氏替換原則。
也有人分為六大原則,分別為單一職責原則、開放封閉原則、依賴倒置原則、接口隔離原則、里氏替換原則、迪米特法則。
現在我們來介紹單一職責原則
單一職責原則
1)概念
按照官方說明,單一職責原則是指 應該有且只有一個一個原因引起類的變更。
通俗一點來說,一個類應該只做一類事情;一個類應該只負責一個功能。
單一職責原則是程序設計高內聚、低耦合的引申。
2)浮想聯偏
作者接觸單一職責原則的時候,以為很簡單。單一職責嘛,一個類一個方法,不就是它的終極目標嗎?
的確,這屬於‘終極目標’但是此終極目標不現實。因為,一個類一個方法的確是高內聚、低耦合。但是這顯然顯得代碼很臃腫了,維護更加不便,在中大型的項目更加如此。如果你的項目足夠簡單,類足夠少,也可以這么來做。
所以,這里要強調一點的是,單一職責原則是一個類處理一類事情,也只有一類事情影響到這個類。並不是一個類處理一個方法。
3)開始理解
我們來舉個例子。作者眼前有一支黑色筆,拿這支筆來做例子吧。
筆有它屬性、被動的行為。屬性有:黑色、手感好、筆尖0.5。行為有:寫字、畫畫、扎人。當然,這里的扎人只是個例子,千萬不要來真的了 >. <
按照一般的做法,我們都把筆的屬性與行為都放在一個類來做。單一職責現在就起作用了,我們要分開成屬性與行為。
來上UML圖:
首先按照一般的設計:
一般一個接口、一個類來處理筆的各種事情,上面的圖充分解析了這種說法,也是平常人設計的類。
下面,我們按照單一職責原則,來設計筆的屬性、行為來隔離開,如下:
從上圖看出,我們把行為以及屬性動作分離開。
舉了這個例子,我們看出一件事情,可以分離開多件事情的處理,從而提高了軟件設計的高內聚、低耦合。
但是,我們從上面的例子,可以在分一下筆的行為。因為畫畫、寫字是筆在紙上做的動作,而扎人是筆在人上做的動作。
更通俗地說,就是畫畫這個動作要發生改變的話,扎人這個動作應該不會受影響,所以扎人應該放到另外一個類中做處理。
下面我們可以更深一層地理解一下這個筆的動作可以分解成2個。
4)更深一層地理解
按照上面說的,我們可以把筆的動作分成兩種,一種在紙上做的,一種是在人上做的。
為什么可以分開這兩種,因為上面說了,一種在紙上做,一種在人上做。在紙上做只影響在紙張的類,在人上做只影響在人生的類。互不干擾。
我們上一下UML圖吧:
到此結束了,下面有空再修改與補充。
其他鏈接:
此文轉發,請注明出處,謝謝。