<讀書(shū)筆記>(模塊層面)BMS-5: 將關(guān)注點(diǎn)進(jìn)行分離

"如果一個(gè)系統(tǒng)即復(fù)雜且高耦合, 則一定會(huì)發(fā)生許多意料之外的事情"

原則: 避免出現(xiàn)大型的復(fù)雜模塊, 因?yàn)槟K過(guò)大功能過(guò)多往往意味著模塊間的緊耦合.

解決之道: 為每個(gè)模塊安排單一的職責(zé), 且使用接口將實(shí)現(xiàn)進(jìn)行隱藏.

好處: 代碼會(huì)變得更易維護(hù). 且代碼更易進(jìn)行測(cè)試和使用.

之前的 4 個(gè)原則都是針對(duì)代碼單元而言的, 意味著在實(shí)踐中應(yīng)用它們可以讓獨(dú)立的代碼單元(方法/構(gòu)造函數(shù))更易維護(hù).

從這里開(kāi)始, 就轉(zhuǎn)而關(guān)注模塊(Module)層面上的內(nèi)容了.

注意: 這里的"模塊"在面向?qū)ο笳Z(yǔ)言中指的是一個(gè)類, 比如 Java 中的一個(gè) class. 即之后的模塊層面上的原則都是為了解決類之間的關(guān)系問(wèn)題的.

而本條原則的主旨是: 解決類之間的耦合問(wèn)題, 總地來(lái)說(shuō)就是分離關(guān)注點(diǎn).

設(shè)計(jì)一個(gè)復(fù)雜的軟件系統(tǒng)需要考慮很多,每一個(gè)需要考慮的方面可以稱之為一個(gè)關(guān)注點(diǎn)(Concern)邮屁,良好的設(shè)計(jì)需要把這些關(guān)注點(diǎn)分門別類整袁,劃分為若干模塊,讓程序開(kāi)發(fā)人員在處理一個(gè)關(guān)注點(diǎn)時(shí)可以盡可能少的被其他關(guān)注點(diǎn)的細(xì)節(jié)所干擾佑吝。模塊化軟件開(kāi)發(fā)就是一種分離關(guān)注點(diǎn)(Separation of Concerns)的手段坐昙,模塊化應(yīng)當(dāng)遵循高內(nèi)聚、低耦合的原則芋忿,提高模塊的獨(dú)立性炸客。

這里遇到一個(gè) fan-in 的概念, 軟件設(shè)計(jì)中,扇入扇出的概念是指應(yīng)用程序模塊之間的層次調(diào)用情況盗飒。
按照結(jié)構(gòu)化設(shè)計(jì)方法,一個(gè)應(yīng)用程序是由多個(gè)功能相對(duì)獨(dú)立的模塊所組成陋桂。
扇入:是指直接調(diào)用該模塊的上級(jí)模塊的個(gè)數(shù)逆趣。扇入大表示模塊的復(fù)用度高。
扇出:是指該模塊直接調(diào)用的下級(jí)模塊的個(gè)數(shù)嗜历。扇出大表示模塊的復(fù)雜度高宣渗,需要控制和協(xié)調(diào)過(guò)多的下級(jí)模塊;但扇出過(guò)欣嬷荨(例如總是1)也不好痕囱。扇出過(guò)大一般是因?yàn)槿狈χ虚g層次,應(yīng)該適當(dāng)增加中間層次的模塊暴匠。扇出太小時(shí)可以把下級(jí)模塊進(jìn)一步分解成若干個(gè)子功能模塊鞍恢,或者合并到它的上級(jí)模塊中去。

設(shè)計(jì)良好的軟件結(jié)構(gòu)每窖,通常頂層扇出比較大帮掉,中間扇出小,底層模塊則有大扇入窒典。

1 一個(gè)實(shí)際的例子

某個(gè)類最開(kāi)始只有讀取用戶, ?修改用戶, 判斷用戶是否存在這三個(gè)功能. 但沒(méi)有使用接口進(jìn)行隱藏實(shí)現(xiàn). 而后隨著不斷添加新的需求, 不斷迭代, 導(dǎo)致類的功能不斷增加, 形成了一個(gè)大型類, 而且該類又被多個(gè)地方調(diào)用(超過(guò) 50 處), 即大扇入. 結(jié)果就是這個(gè)類變成一個(gè)緊耦合的類, 因?yàn)樗淮罅康纳蠈幽K調(diào)用, 且沒(méi)有接口, 而是直接在實(shí)現(xiàn)上進(jìn)行調(diào)用, 而且它也知道許多其他類的內(nèi)部情況.(比如它可以調(diào)用不同的數(shù)據(jù)訪問(wèn)層模塊來(lái)完成不同的功能, 而這些調(diào)用也是在實(shí)現(xiàn)上調(diào)用, 而非調(diào)用接口.)

模塊間的耦合指的是當(dāng)改變發(fā)生的時(shí)候, 卻發(fā)現(xiàn)兩個(gè)或多個(gè)系統(tǒng)部分是連接在一起的. 就像是你想拆掉發(fā)動(dòng)機(jī), 卻發(fā)現(xiàn)發(fā)動(dòng)機(jī)和變速箱焊到了一起解不開(kāi)了.

這種緊耦合的結(jié)果就是它們變?yōu)榱丝删S護(hù)性提升道路上的絆腳石. 而上面說(shuō)的這個(gè)大型類也就是沒(méi)有合理分離關(guān)注點(diǎn)才形成的.

而這樣的大型類后面也就越來(lái)越難理解, 甚至變得無(wú)法管理.

?總結(jié)一下, 為什么類之間的耦合需要高度重視, 主要是因?yàn)?

  • 耦合本身就是一個(gè)模塊層面上的代碼問(wèn)題.
  • 耦合是絕對(duì)存在的, 但它有程度的區(qū)別, 我們要做到的是盡量低耦合. 而耦合的程度是通過(guò) number of callsize of that class 共同來(lái)衡量, 即外界的調(diào)用數(shù)量(扇入), 以及這個(gè)類的大小. 比如外界若調(diào)用這個(gè)類的次數(shù)更多, 那這個(gè)類就應(yīng)該要更小.

從整個(gè)程序的維度來(lái)看, ?上層模塊的扇出(調(diào)用其他模塊的次數(shù))應(yīng)該是大的, 而底層模塊的扇入(被其他模塊調(diào)用的次數(shù))應(yīng)該是大的, 所以保證低耦合的手段就是盡量減小類的體積. 而減小類體積的方法就是對(duì)關(guān)注點(diǎn)進(jìn)行合理分離(?假設(shè)在代碼單元層面上的可維護(hù)原則已經(jīng)得到合理應(yīng)用), 另外就?是使用接口來(lái)隱藏實(shí)現(xiàn), 從而達(dá)到低耦合.

2 動(dòng)機(jī)

  1. 更小的, 更低耦合的模塊讓多人開(kāi)發(fā)更加容易, 并且變更的時(shí)候更加容易進(jìn)行.
  2. 更小的, 更低耦合的模塊更加容易定位.
  3. 更小的, 更低耦合的模塊對(duì)所有開(kāi)發(fā)者都更加友好.

3 做法

  1. 將關(guān)注點(diǎn)進(jìn)行合理分離, 從而減小類的體積. 即模塊的功能應(yīng)該是單一的, 這需要對(duì)關(guān)注點(diǎn)進(jìn)行合理分離.
  2. 利用接口來(lái)隱藏實(shí)現(xiàn).
  3. 將代碼替換為 Library 或 Framework, 這樣可以保證在一處維護(hù)代碼而讓多處使用, 這樣也可以保證模塊間的低耦合.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蟆炊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瀑志,更是在濱河造成了極大的恐慌涩搓,老刑警劉巖污秆,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異昧甘,居然都是意外死亡良拼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門疾层,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)将饺,“玉大人,你說(shuō)我怎么就攤上這事痛黎∮杌。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵湖饱,是天一觀的道長(zhǎng)掖蛤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)井厌,這世上最難降的妖魔是什么蚓庭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮仅仆,結(jié)果婚禮上器赞,老公的妹妹穿的比我還像新娘。我一直安慰自己墓拜,他們只是感情好港柜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著咳榜,像睡著了一般夏醉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涌韩,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天畔柔,我揣著相機(jī)與錄音,去河邊找鬼臣樱。 笑死靶擦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雇毫。 我是一名探鬼主播奢啥,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嘴拢!你這毒婦竟也來(lái)了桩盲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤席吴,失蹤者是張志新(化名)和其女友劉穎赌结,沒(méi)想到半個(gè)月后捞蛋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柬姚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年拟杉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片量承。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搬设,死狀恐怖撕捍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忧风,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布腿宰,位于F島的核電站,受9級(jí)特大地震影響吃度,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜椿每,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一拖刃、第九天 我趴在偏房一處隱蔽的房頂上張望删壮。 院中可真熱鬧贪绘,春花似錦、人聲如沸央碟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)亿虽。三九已至菱涤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洛勉,已是汗流浹背粘秆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留收毫,地道東北人攻走。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓殷勘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親昔搂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玲销,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容