二、内聚
【內(nèi)聚】
1.內(nèi)聚的定義
? ? 一個模塊內(nèi)部元素彼此結(jié)合的緊密程度。其中關(guān)鍵字:模塊、元素、結(jié)合
? ??模塊:大到子系統(tǒng),小到一個函數(shù),都可以看成一個模塊
? ? 元素:
? ? ? ? ? ?模塊:包、命名空間等
? ? ? ? ? ?包:類、接口、全局?jǐn)?shù)據(jù)等
? ? ? ? ? ?類/接口:方法、屬性
? ? ? ? ? ?函數(shù):內(nèi)部的代碼
? 結(jié)合: 用“凝聚力”來理解,更貼切。
? ? ? ? 假如說一個類的方法,都依賴于類自身的其他方法,我們說它內(nèi)聚高。如果一個類的方法依賴外部類的方法,那么這個類的內(nèi)聚性一定不高嗎?不一定。判斷一個模塊內(nèi)部元素的內(nèi)聚性是否高,要看這個模塊內(nèi)部元素的凝聚力。什么是凝聚力?凝聚力就是對模塊本身職責(zé)的專注程度。
? ? ? ? ?例如:操作數(shù)據(jù)庫的CURD類。CURD方法之間沒有任何結(jié)合的關(guān)系。但這四個方法是高內(nèi)聚的。因?yàn)樗鼈兌紝W⒂贑URD類本身的職責(zé)。
2.內(nèi)聚的分類
? ? ? ? 偶然內(nèi)聚:是內(nèi)聚性最差的一種。僅僅是因?yàn)槟硞€和本身業(yè)務(wù)無關(guān)的原因而劃分到同一個模塊中。例如最常見的,Utils包。這個包主要是提供一些常用的小工具,像個百寶箱一樣。這種包中的各個功能模塊、各個類專注的職責(zé)都是獨(dú)立的,僅是為了方便取用而劃分到了一起。
? ? ? ? 邏輯內(nèi)聚:模塊內(nèi)的元素屬于同一個比較寬泛的類別,但元素的職責(zé)上可能不一樣。例如:鼠標(biāo)、鍵盤、顯示器、打印機(jī),都同屬于IO設(shè)備,但這樣的內(nèi)聚相對還是比較弱的。鼠標(biāo)、鍵盤歸類為輸入設(shè)備模塊,顯示器、打印機(jī)歸類為輸出設(shè)備模塊。這樣,內(nèi)聚性會更高一點(diǎn)。
? ? ? ? 時間內(nèi)聚:這種內(nèi)聚一般在函數(shù)中比較常見。模塊內(nèi)的元素之所以被劃分到一個模塊內(nèi),是因?yàn)檫@些元素的動作在時間上很相近。或者說在某一事件發(fā)生、某一狀態(tài)改變時會調(diào)用這些元素進(jìn)行業(yè)務(wù)處理。例如:異常處理。拋出異常后,一般我們要做釋放資源、記錄日志、通知用戶這些動作都要執(zhí)行。
? ? ? ? 過程內(nèi)聚:這種內(nèi)聚一般在函數(shù)中比較常見。這類元素一般是在處理某個業(yè)務(wù)操作時,必須按照一定的順序來執(zhí)行。例如:讀/寫文件操作。1.判斷文件是否存在,2文件是否有權(quán)限,3打開文件,4讀/寫文件。以上這4步的函數(shù)都是為了完成讀/寫文件這一個操作,并且順序不能錯亂。那么把這4個函數(shù)封裝在一個函數(shù)中,那么它們之間就是過程內(nèi)聚。
? ? ? ? 信息內(nèi)聚:元素被劃分到一個模塊中是因?yàn)檫@些元素所操作的數(shù)據(jù)都是相同的數(shù)據(jù) 或 數(shù)據(jù)類型 或 數(shù)據(jù)源。例如學(xué)生信息類中有對學(xué)生信息操作的CURD方法,那么這些方法在這個類中的內(nèi)聚就是信息內(nèi)聚。
? ? ? ? 順序內(nèi)聚:一個元素執(zhí)行后的輸出,是一個元素執(zhí)行前的輸入,元素之間這種環(huán)環(huán)相扣的關(guān)系就是順序內(nèi)聚。例如:規(guī)則引擎,一個函數(shù)負(fù)責(zé)讀取配置,根據(jù)讀取的配置輸出轉(zhuǎn)換后的執(zhí)行指令,另一個函數(shù)讀取指令進(jìn)而去執(zhí)行。
? ? ? ? 功能內(nèi)聚:功能內(nèi)聚是最好的一種內(nèi)聚方式。模塊內(nèi)部的元素之所以被劃分到一個模塊中,是因?yàn)槎际菫榱送瓿赏粋€單一任務(wù)。同一個單一任務(wù)這個概念比較難界定。因?yàn)榍懊嬲f的IO設(shè)備、異常處理、讀寫文件也都是單一任務(wù)。功能內(nèi)聚中的單一任務(wù)是指,元素的功能只為了完成所在模塊的任務(wù),別無其他用途。例如:判斷文件是否存在這個函數(shù),既可以在讀寫文件中用,也可以在刪除文件中用;再例如,發(fā)薪水模塊中的計算個人所得稅函數(shù),這個函數(shù)就是功能內(nèi)聚的,因?yàn)樗擞迷诎l(fā)薪水中,其他業(yè)務(wù)中用不上。
轉(zhuǎn)載于:https://www.cnblogs.com/mysic/p/8489010.html
總結(jié)
- 上一篇: IllegalThreadStateEx
- 下一篇: PHP+Swoole实现的网页即时聊天通