<h3>內(nèi)聚</h3>
<p>當(dāng)模塊的元素全部專注于模塊的職責(zé)的時(shí)候,即使元素間的結(jié)合不是很緊密,也符合內(nèi)聚性的要求。簡(jiǎn)單的說(shuō),就是“<strong>不要掛羊頭賣狗肉</strong>”。</p>
<ul>
<li>巧合內(nèi)聚
</li>
</ul>
<blockquote>
<p>模塊內(nèi)部的元素被劃分在一起,僅僅是因?yàn)椤扒珊稀薄?lt;/p>
</blockquote>
<ul>
<li>邏輯內(nèi)聚</li>
</ul>
<blockquote>
<p>模塊內(nèi)部元素之所以被劃分在一起,是因?yàn)檫@些元素邏輯上屬于同一個(gè)比較寬泛的類別。</p>
<p>比如將鼠標(biāo)、鍵盤(pán)劃分入輸入類,將打印機(jī)、顯示器劃分為輸出類。</p>
</blockquote>
<ul>
<li>時(shí)序內(nèi)聚</li>
</ul>
<blockquote>
<p>模塊內(nèi)部的元素之所以被劃分在同一個(gè)模塊中,是因?yàn)檫@些元素必須按照固定的“<strong>時(shí)間順序</strong>”進(jìn)行處理。</p>
</blockquote>
<ul>
<li>過(guò)程內(nèi)聚</li>
</ul>
<blockquote>
<p>模塊內(nèi)部的元素之所以被劃分在同一個(gè)模塊中,是因?yàn)檫@些元素必須按照固定的“<strong>過(guò)程順序</strong>”進(jìn)行處理。</p>
<p>判斷文件是否存在、判斷文件是否有權(quán)限、打開(kāi)文件、讀(或者寫(xiě))文件,那么把這些處理封裝在一個(gè)函數(shù)中,它們之間的內(nèi)聚就是“過(guò)程內(nèi)聚”。</p>
</blockquote>
<ul>
<li>交互內(nèi)聚</li>
</ul>
<blockquote>
<p>模塊內(nèi)部的元素之所以被劃分在同一模塊中,是因?yàn)檫@些元素都操作相同的數(shù)據(jù)。</p>
<p>交互內(nèi)聚最常見(jiàn)的就是數(shù)據(jù)結(jié)構(gòu)的類定義了,例如 Java HashMap 的 get、put、clear 等操作。</p>
</blockquote>
<ul>
<li>功能內(nèi)聚</li>
</ul>
<blockquote>
<p>模塊內(nèi)部的元素之所以被劃分在同一模塊中,是因?yàn)檫@些元素都是為了完成同一項(xiàng)任務(wù)。</p>
</blockquote>
<h3>耦合</h3>
<blockquote>
<p><strong>耦合和內(nèi)聚是相反的:內(nèi)聚關(guān)注模塊內(nèi)部的元素結(jié)合程度,耦合關(guān)注模塊之間的依賴程度。</strong></p>
</blockquote>
<ul>
<li>無(wú)耦合</li>
</ul>
<blockquote>
<p>無(wú)耦合意味著模塊之間沒(méi)有任何關(guān)系或者交互。</p>
</blockquote>
<ul>
<li>消息耦合</li>
</ul>
<blockquote>
<p>系統(tǒng)/子系統(tǒng):兩個(gè)系統(tǒng)交互的協(xié)議數(shù)據(jù),例如:HTTP POST 數(shù)據(jù),Java RPC、Socket 數(shù)據(jù)等;
類/函數(shù):函數(shù)的參數(shù)即“消息”。例如:A 類的函數(shù)調(diào)用了 B 類的某個(gè)函數(shù),傳入的參數(shù)就是消息。</p>
</blockquote>
<ul>
<li>數(shù)據(jù)耦合</li>
</ul>
<blockquote>
<p>兩個(gè)模塊間通過(guò)參數(shù)傳遞基本數(shù)據(jù),稱為數(shù)據(jù)耦合。</p>
</blockquote>
<ul>
<li>數(shù)據(jù)結(jié)構(gòu)耦合</li>
</ul>
<blockquote>
<p>數(shù)據(jù)結(jié)構(gòu)耦合和數(shù)據(jù)耦合是比較相近的,主要差別在于數(shù)據(jù)結(jié)構(gòu)耦合中傳遞的不是基本數(shù)據(jù),而是數(shù)據(jù)結(jié)
構(gòu)數(shù)據(jù)。</p>
</blockquote>
<ul>
<li>控制耦合</li>
</ul>
<blockquote>
<p>當(dāng)一個(gè)模塊可以通過(guò)某種方式來(lái)控制另外一個(gè)模塊的行為時(shí),稱為控制耦合。</p>
</blockquote>
<ul>
<li>外部耦合</li>
</ul>
<blockquote>
<p>為了讓香港的插頭也能在大陸用,我們就需要買(mǎi)一個(gè)“電源轉(zhuǎn)換頭”,其作用就是能夠讓原來(lái)不兼容的香港插頭和大陸插座兩個(gè)設(shè)備能夠連接起來(lái),但原有兩個(gè)設(shè)備內(nèi)部都繼續(xù)保持原樣。</p>
<p>這里的香港插頭和大陸插座就是外部耦合關(guān)系,外部設(shè)備是“電源轉(zhuǎn)換頭”
在軟件系統(tǒng),外部依賴最典型的莫過(guò)于各種“proxy”模塊或者子系統(tǒng)了。比如說(shuō) A 系統(tǒng)輸出 XML 格式,
B 系統(tǒng)只能接收 JSON 格式的數(shù)據(jù),為了能夠讓兩個(gè)系統(tǒng)連接起來(lái),需要開(kāi)發(fā)一個(gè)轉(zhuǎn)換程序,完成格式轉(zhuǎn)換。</p>
<p>簡(jiǎn)單來(lái)說(shuō),很多東西不是你想改就能改的!使用外部依賴一般的主要原因如下:</p>
<ol>
<li>已有系統(tǒng)無(wú)法改動(dòng):比如說(shuō)你買(mǎi)的香港插頭和大陸插座,除非你真的是吃飽了沒(méi)事做或者要挑戰(zhàn)自己,否則一般人都不會(huì)自己動(dòng)手將香港插頭改為大陸插頭,或者將大陸插座改為香港插座。</li>
<li>已有系統(tǒng)已經(jīng)成熟,改動(dòng)需要很高的成本,也會(huì)導(dǎo)致系統(tǒng)不穩(wěn)定。</li>
<li>已有系統(tǒng)支持很多其它系統(tǒng),不能為了你的系統(tǒng)單獨(dú)修改。</li>
</ol>
</blockquote>
<h3>高內(nèi)聚低耦合</h3>
<blockquote>
<p><strong>如果我們不做到這點(diǎn),將會(huì)怎樣?</strong></p>
</blockquote>
<p><em>如果一個(gè)模塊內(nèi)聚性較低,則這個(gè)模塊很容易變化。一旦變化,設(shè)計(jì)、編碼、測(cè)試、編譯、部署的工作量就上來(lái)了,而一旦一個(gè)模塊變化,與之相關(guān)的模塊都需要跟著改變。</em></p>
<blockquote>
<p><strong>高內(nèi)聚低耦合是否意味著內(nèi)聚越高越好,耦合越低越好?</strong></p>
</blockquote>
<ol>
<li>
<p>并不是內(nèi)聚越高越好,耦合越低越好,真正好的設(shè)計(jì)
是在高內(nèi)聚和低耦合間進(jìn)行平衡,也就是說(shuō)高內(nèi)聚和低耦合是沖突的。</p>
</li>
<li>
<p>最強(qiáng)的內(nèi)聚莫過(guò)于一個(gè)類只寫(xiě)一個(gè)函數(shù),這樣內(nèi)聚性絕對(duì)是最高的。但這會(huì)帶來(lái)一個(gè)明顯
的問(wèn)題:類的數(shù)量急劇增多,這樣就導(dǎo)致了其它類的耦合特別多,于是整個(gè)設(shè)計(jì)就變成了“高內(nèi)聚高耦合”了。由于高耦合,整個(gè)系統(tǒng)變動(dòng)同樣非常頻繁。</p>
</li>
<li>
<p>對(duì)于耦合來(lái)說(shuō),最弱的耦合是一個(gè)類將所有的函數(shù)都包含了,這樣類完全不依賴其它類,耦合性是最低的。但這樣會(huì)帶來(lái)一個(gè)明顯的問(wèn)題:內(nèi)聚性很低,于是整個(gè)設(shè)計(jì)就變成了“低耦合低內(nèi)聚”了。由于低內(nèi)聚,整個(gè)類的變動(dòng)同樣非常頻繁。</p>
</li>
<li>
<p>對(duì)于“低耦合低內(nèi)聚”來(lái)說(shuō),還有另外一個(gè)明顯的問(wèn)題:幾乎無(wú)法被其它類重用。原因很簡(jiǎn)單,類本身太龐大了,要么實(shí)現(xiàn)很復(fù)雜,要么數(shù)據(jù)很大,其它類無(wú)法明確該如何重用這個(gè)類。</p></li></ol>
面向?qū)ο蠹记芍邇?nèi)聚低耦合?。。?/h2> 最后編輯于 :?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 前言 高內(nèi)聚低耦合,是軟件工程中的概念,是判斷設(shè)計(jì)好壞的標(biāo)準(zhǔn),主要是面向?qū)ο蟮脑O(shè)計(jì),看類的內(nèi)聚性是否高,耦合度是否...
- //我所經(jīng)歷的大數(shù)據(jù)平臺(tái)發(fā)展史(三):互聯(lián)網(wǎng)時(shí)代 ? 上篇http://www.infoq.com/cn/arti...
- (文章來(lái)自于博客園) 起因:模塊獨(dú)立性指每個(gè)模塊只完成系統(tǒng)要求的獨(dú)立子功能,并且與其他模塊的聯(lián)系最少且接口簡(jiǎn)單,兩...
- 文章轉(zhuǎn)載自:http://www.cnblogs.com/robnetcn/archive/2012/04/15/...
- 前段時(shí)間徐靜蕾和蔣方舟上了《圓桌派》,大家沸沸揚(yáng)揚(yáng)的討論42歲的徐靜蕾和28歲的蔣方舟誰(shuí)更有新女性精神。我的小伙伴...