二、内聚
【內聚】
1.內聚的定義
? ? 一個模塊內部元素彼此結合的緊密程度。其中關鍵字:模塊、元素、結合
? ??模塊:大到子系統,小到一個函數,都可以看成一個模塊
? ? 元素:
? ? ? ? ? ?模塊:包、命名空間等
? ? ? ? ? ?包:類、接口、全局數據等
? ? ? ? ? ?類/接口:方法、屬性
? ? ? ? ? ?函數:內部的代碼
? 結合: 用“凝聚力”來理解,更貼切。
? ? ? ? 假如說一個類的方法,都依賴于類自身的其他方法,我們說它內聚高。如果一個類的方法依賴外部類的方法,那么這個類的內聚性一定不高嗎?不一定。判斷一個模塊內部元素的內聚性是否高,要看這個模塊內部元素的凝聚力。什么是凝聚力?凝聚力就是對模塊本身職責的專注程度。
? ? ? ? ?例如:操作數據庫的CURD類。CURD方法之間沒有任何結合的關系。但這四個方法是高內聚的。因為它們都專注于CURD類本身的職責。
2.內聚的分類
? ? ? ? 偶然內聚:是內聚性最差的一種。僅僅是因為某個和本身業務無關的原因而劃分到同一個模塊中。例如最常見的,Utils包。這個包主要是提供一些常用的小工具,像個百寶箱一樣。這種包中的各個功能模塊、各個類專注的職責都是獨立的,僅是為了方便取用而劃分到了一起。
? ? ? ? 邏輯內聚:模塊內的元素屬于同一個比較寬泛的類別,但元素的職責上可能不一樣。例如:鼠標、鍵盤、顯示器、打印機,都同屬于IO設備,但這樣的內聚相對還是比較弱的。鼠標、鍵盤歸類為輸入設備模塊,顯示器、打印機歸類為輸出設備模塊。這樣,內聚性會更高一點。
? ? ? ? 時間內聚:這種內聚一般在函數中比較常見。模塊內的元素之所以被劃分到一個模塊內,是因為這些元素的動作在時間上很相近。或者說在某一事件發生、某一狀態改變時會調用這些元素進行業務處理。例如:異常處理。拋出異常后,一般我們要做釋放資源、記錄日志、通知用戶這些動作都要執行。
? ? ? ? 過程內聚:這種內聚一般在函數中比較常見。這類元素一般是在處理某個業務操作時,必須按照一定的順序來執行。例如:讀/寫文件操作。1.判斷文件是否存在,2文件是否有權限,3打開文件,4讀/寫文件。以上這4步的函數都是為了完成讀/寫文件這一個操作,并且順序不能錯亂。那么把這4個函數封裝在一個函數中,那么它們之間就是過程內聚。
? ? ? ? 信息內聚:元素被劃分到一個模塊中是因為這些元素所操作的數據都是相同的數據 或 數據類型 或 數據源。例如學生信息類中有對學生信息操作的CURD方法,那么這些方法在這個類中的內聚就是信息內聚。
? ? ? ? 順序內聚:一個元素執行后的輸出,是一個元素執行前的輸入,元素之間這種環環相扣的關系就是順序內聚。例如:規則引擎,一個函數負責讀取配置,根據讀取的配置輸出轉換后的執行指令,另一個函數讀取指令進而去執行。
? ? ? ? 功能內聚:功能內聚是最好的一種內聚方式。模塊內部的元素之所以被劃分到一個模塊中,是因為都是為了完成同一個單一任務。同一個單一任務這個概念比較難界定。因為前面說的IO設備、異常處理、讀寫文件也都是單一任務。功能內聚中的單一任務是指,元素的功能只為了完成所在模塊的任務,別無其他用途。例如:判斷文件是否存在這個函數,既可以在讀寫文件中用,也可以在刪除文件中用;再例如,發薪水模塊中的計算個人所得稅函數,這個函數就是功能內聚的,因為它除了用在發薪水中,其他業務中用不上。
轉載于:https://www.cnblogs.com/mysic/p/8489010.html
總結
- 上一篇: IllegalThreadStateEx
- 下一篇: 互斥量和信号量的区别