代碼耦合(轉(zhuǎn)載)

作者:楊博鏈接:https://www.zhihu.com/question/21386172/answer/54476702來源:知乎著作權(quán)歸作者所有秧均。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)傀缩,非商業(yè)轉(zhuǎn)載請注明出處。以前狸捕,我寫代碼時,我考慮模塊(本文中的模塊就是指單個源文件)的單向依賴關(guān)系撵割,考慮接口的正交性和緊湊性奠宜。我覺得我在做低耦合的好設(shè)計。
然而嚷那,我發(fā)現(xiàn)其他程序員寫的代碼依賴關(guān)系混亂胞枕,接口臃腫,但他們?nèi)匀挥X得自己寫的代碼耦合很低魏宽,設(shè)計很好腐泻。我這才發(fā)現(xiàn),我理解的耦合和他們理解的不一樣队询。他們理解的低耦合就是把代碼提出來派桩,讓代碼不要“亂”。然而蚌斩,對于什么是“耦合”窄坦、什么是“亂”,他們并不知道有什么客觀標(biāo)準(zhǔn)可以度量凳寺。
所以鸭津,現(xiàn)在我相信“耦合”是個有歧義的壞詞,“低耦合”是個程序員經(jīng)常誤用的理論肠缨。我建議逆趋,設(shè)計架構(gòu)、考察模塊之間關(guān)系時晒奕,不要用“耦合”闻书、“亂”這些無法度量的詞語名斟,而應(yīng)該改用以下三個可以度量的指標(biāo):依賴、正交性魄眉、緊湊性砰盐。
依賴和耦合的最大區(qū)別在于,當(dāng)我們說“A和B耦合”時坑律,在字面含義中岩梳,A和B二者平等。然而晃择,正確的模塊關(guān)系根本不應(yīng)該平等冀值,而應(yīng)該是單向依賴才對。所以我們應(yīng)該說“A依賴B”宫屠,這樣含義要清楚得多列疗。A依賴B意味著,A模塊可以調(diào)用B模塊暴露的API浪蹂,但B模塊絕不允許調(diào)用A模塊的API抵栈。單向依賴是紅線,好的設(shè)計一定不會違反這條紅線坤次。
注意:根據(jù)實質(zhì)重于形式**原則竭讳,本文中的“依賴”指人腦中的依賴而不是編譯器的依賴。只要程序員編寫模塊A時浙踢,需要知道模塊B的存在,需要知道模塊B提供哪些功能灿渴,A對B依賴就存在洛波。甚至就算通過所謂的依賴注入、命名查找之類的“解耦”手段骚露,讓模塊A不需要import B或者include "B.h"蹬挤,人腦中的依賴仍舊一點都沒有變化。唯一的作用是會騙過后文會提到的代碼打分工具棘幸,讓工具誤以為兩個模塊間沒有依賴焰扳。
所以 @翟志軍

的例子中的解耦只是在自娛自樂兜圈子而已。因為不管你用什么技術(shù)手段误续,Configuration的調(diào)用方程序員總是需要知道配置項的具體業(yè)務(wù)含義才能用啊吨悍。
很多程序員覺得“耦合”是壞事,愛寫兜圈子的代碼來消除所謂的“耦合”蹋嵌。但是我們改用“依賴”術(shù)語后育瓜,我們就發(fā)現(xiàn)單向依賴不是壞事,根本不必費心消除栽烂,因為躏仇,真正的重點是恋脚,依賴關(guān)系中,被依賴方暴露的接口能不能足夠“正交”和“緊湊”焰手。
正交性是指一個模塊提供的API中糟描,多個方法之間是否有重復(fù)的功能。如果有重復(fù)功能书妻,正交性就差船响。通常,正交性高的模塊更穩(wěn)定驻子,不會因為上層業(yè)務(wù)變化而被迫修改代碼灿意。好的API內(nèi)部的多個方法之間不應(yīng)該有任何重復(fù)功能,只實現(xiàn)正交的機制崇呵。
如果感覺拆得太細(xì)使用不便缤剧,應(yīng)該在底層API之外包裝出一層Helper、Utility組成的膠水層域慷。膠水層調(diào)用底層原語API來實現(xiàn)常用模式供上層使用荒辕。對于膠水層中的模塊,對正交性的要求可以稍低一些犹褒。注意上層代碼既可以直接調(diào)用正交的底層API抵窒,又可以調(diào)用膠水層的常用模式。
緊湊性是指一個模塊提供的API中叠骑,公有方法總數(shù)必須很少李皇,每個方法的參數(shù)也必須很少≈婕希《Unix編程藝術(shù)》上說一個模塊不要超過7個方法掉房,不然就很難理解。但我實踐中發(fā)現(xiàn)慰丛,我一般編寫的模塊卓囚,公有方法通常不超過3個。
總之诅病,單向依賴哪亿、正交性、緊湊性這三個指標(biāo)都很務(wù)實贤笆,有客觀方法可以度量蝇棉。我覺得也許可以代替“低耦合”這種“公說公有理婆說婆有理”的務(wù)虛理論。比如前兩天我們ThoughtWorks的咨詢師郵件列表中就有人分享一些工具芥永,用上述標(biāo)準(zhǔn)自動檢查代碼質(zhì)量银萍。那么將來你和別的程序員約架,你要噴對方代碼寫得爛恤左,你就有了依據(jù)贴唇,因為你可以直接用工具給代碼打分搀绣。
另外,將來如果有同事或者網(wǎng)友在討論編程時戳气,用了“耦合”链患、“解耦”、“亂”之類的混亂術(shù)語瓶您,你可以把這篇文章發(fā)給他看麻捻,然后鄙視他。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呀袱,一起剝皮案震驚了整個濱河市贸毕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夜赵,老刑警劉巖明棍,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寇僧,居然都是意外死亡摊腋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門嘁傀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兴蒸,“玉大人,你說我怎么就攤上這事细办〕鹊剩” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵笑撞,是天一觀的道長岛啸。 經(jīng)常有香客問我,道長娃殖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任议谷,我火速辦了婚禮炉爆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卧晓。我一直安慰自己芬首,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布逼裆。 她就那樣靜靜地躺著郁稍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胜宇。 梳的紋絲不亂的頭發(fā)上耀怜,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天恢着,我揣著相機與錄音,去河邊找鬼财破。 笑死掰派,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的左痢。 我是一名探鬼主播靡羡,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俊性!你這毒婦竟也來了略步?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤定页,失蹤者是張志新(化名)和其女友劉穎趟薄,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拯勉,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡竟趾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宫峦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岔帽。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖导绷,靈堂內(nèi)的尸體忽然破棺而出犀勒,到底是詐尸還是另有隱情,我是刑警寧澤妥曲,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布贾费,位于F島的核電站,受9級特大地震影響檐盟,放射性物質(zhì)發(fā)生泄漏褂萧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一葵萎、第九天 我趴在偏房一處隱蔽的房頂上張望导犹。 院中可真熱鬧,春花似錦羡忘、人聲如沸谎痢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽节猿。三九已至,卻和暖如春漫雕,著一層夾襖步出監(jiān)牢的瞬間滨嘱,已是汗流浹背峰鄙。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留九孩,地道東北人先馆。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像躺彬,于是被迫代替她去往敵國和親煤墙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,325評論 25 707
  • 前言 Unix是開源運動歷史上最著名的代表之一宪拥,而如今前端是開源運動中最活躍的一支隊伍仿野,我相信它們兩者之間一定有共...
    云峰yf閱讀 3,193評論 0 6
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法她君,內(nèi)部類的語法脚作,繼承相關(guān)的語法,異常的語法缔刹,線程的語...
    子非魚_t_閱讀 31,665評論 18 399
  • 漸漸地隨著年齡的增長不知不覺中變得越來迷茫了球涛,自己以前做過的決定不知道在某一天會不會讓我知道對與錯(能否驗證我的想...
    幸福是什么呢閱讀 491評論 1 2
  • 近兩年沒玩過玩游戲亿扁,在電腦游戲上也沒有天賦,但是我痛恨失斈窭从祝!沒有過關(guān)的會玩到贏下來為止。后來變狡猾了引谜,開局沒有打好...
    何老師干貨2閱讀 225評論 0 0