簡介
在面向對象編程領域中, 單一功能原則(Single responsibility principle)規定每個類都應該有一個單一的功能,並且該功能應該由這個類完全封裝起來。所有它的(這個類的)服務都應該嚴密的和該功能平行(功能平行,意味著沒有依賴)。
這個術語由羅伯特·C·馬丁(Robert Cecil Martin)在他的《敏捷軟體開發,原則,模式和實踐》一書中的一篇名為〈面向對象設計原則〉的文章中給出。馬丁表述該原則是基於的《結構化分析和系統規格》一書中的內聚原則(Cohesion)上。
馬丁把功能(職責)定義為:“改變的原因”,並且總結出一個類或者模組應該有且只有一個改變的原因。一個具體的例子就是,想像有一個用於編輯和列印報表的模組。這樣的一個模組存在兩個改變的原因。第一,報表的內容可以改變(編輯)。第二,報表的格式可以改變(列印)。這兩方面會的改變因為完全不同的起因而發生:一個是本質的修改,一個是表面的修改。單一功能原則認為這兩方面的問題事實上是兩個分離的功能,因此他們應該分離在不同的類或者模組里。把有不同的改變原因的事物耦合在一起的設計是糟糕的。
保持一個類專注於單一功能點上的一個重要的原因是,它會使得類更加的健壯。繼續上面的例子,如果有一個對於報表編輯流程的修改,那么將存在極大的危險性,因為假設這兩個功能存在於同一個類中,修改報表的編輯流程會導致公共狀態或者依賴關係的改變,列印功能的代碼會因此不工作。
關注點分離
關注點分離(Separation of concerns,SOC)是對只與“特定概念、目標”(關注點)相關聯的軟體組成部分進行“標識、封裝和操縱”的能力,即標識、封裝和操縱關注點的能力。是處理複雜性的一個原則。由於關注點混雜在一起會導致複雜性大大增加,所以能夠把不同的關注點分離開來,分別處理就是處理複雜性的一個原則,一種方法。
關注點分離在計算機科學中,是將電腦程式分隔為不同部分的設計原則,是面向對象的程式設計的核心概念。每一部分會有各自的關注焦點。關注焦點是影響計算機程式代碼的一組資訊。關注焦點可以像是將代碼最佳化過的硬體細節一般,或者像實例化類別的名稱一樣具體。展現關注點分離設計的程式被稱為模組化程式。模組化程度,也就是區分關注焦點,通過將資訊封裝在具有明確界面的程式代碼段落中。封裝是一種資訊隱藏手段。資訊系統中的分層設計是關注點分離的另一個實施例(例如,表示層,業務邏輯層,數據訪問層,維持齊一層)。分離關注點使得解決特定領域問題的代碼從業務邏輯中獨立出來,業務邏輯的代碼中不再含有針對特定領域問題代碼的調用(將針對特定領域問題代碼抽象化成較少的程式碼,例如將代碼封裝成function或是class),業務邏輯同特定領域問題的關係通過側面來封裝、維護,這樣原本分散在整個應用程式中的變動就可以很好的管理起來。
關注點分離的價值在於簡化電腦程式的開發和維護。當關注點分開時,各部分可以重複使用,以及獨立開發和更新。具有特殊價值的是能夠稍後改進或修改一段代碼,而無需知道其他部分的細節必須對這些部分進行相應的更改。
內聚性跳到導航跳到搜尋
內聚性( Cohesion)也稱為 內聚力,是一軟體度量,是指機能相關的程式組合成一模組的程度,或是各機能凝聚的狀態或程度。是結構化分析的重要概念之一。量測內聚性的方式很多,有些方法是由分析原始碼,得到非量化的結果,有些方法則是檢查原始碼的文本特徵,以得到內聚性的量化分數。內聚性是屬於順序式的量測量,一般會以“高內聚性”或“低內聚性”來表示。一般會希望程式的模組有高內聚性,因為高內聚性一般和許多理想的軟體特性有關,包括魯棒性、可靠度、可復用性及易懂性(understandability)等特性,而低內聚性一般也代表不易維護、不易測試、不易復用以及難以理解。
耦合性是一個和內聚性相對的概念。一般而言高內聚性代表低耦合性,反之亦然。內聚性是由賴瑞·康斯坦丁所提出,是以實務上可減少維護及修改的“好”軟體的特性為基礎。