重要的JAVA開發思想之——高內聚低耦合

JAVA軟件開發中有一條鐵律“高內聚、低耦合”就是這個道理:必要的耦合不可否認,沒有耦合程序就做不成事;但是不必要的緊耦合,就會讓程序“牽一發而動全身”,最終讓程序員的編寫和維護都無從下手。

人類同一時間只能專注于一小部分的內容。“高內聚、低耦合”就是為了滿足人類的這個特點——小尺度上只專注一個模塊,局部的編碼工作才能夠進行。大尺度上把具體代碼轉化為一些抽象的“模塊”和“依賴關系”,才能夠抓大放小,把握住程序的脈絡,拼合出一個完整的產品。

想象一下“社會大分工”這個模型——每一個小單位只專注自己的業務部分,與其他單位只存在業務外包的關聯,以及物質、信息的交互。事實已經證明:這樣的模型比以前大國企“大包大攬”自辦各種職能部門的效率,有量級程度的提高。這就是“高內聚、低耦合”在現實世界中的體現。

程序就是人類創造的第二世界,程序的邏輯無非是世界運行規律的抽象。

所以,不管你的角度如何,關注的層次高低,降低復雜度都是必要的。這就是耦合和解耦合的核心理念。

據說任何比喻都是蹩腳的,在這里還是舉一個現實中極其高效與低耦合的例子,那就是軍隊。一個國家的軍隊少則數萬人,多則數百萬人,這么龐大的一個系統,它的效率卻是驚人的高。為什么?簡單來說這要歸功于它的幾個行事原則:

紀律嚴明,令行禁止

不會出現上級發出命令后找不到人執行,或找到人卻不愿意做的尷尬情況(內聚的體現)

命令不跨級

除非特殊情況,否則命令都是通過直接上級傳達的,司令很少會單獨找小兵做事(每一級在上一級看來都高內聚的,同時連長、班長、團長這些頭頭充當了本級的一個接口,上一級僅通過接口來向下級發命令)

有人說,如果司令直接找小兵給他做事不是比一級一級傳達效率更高嗎?no!為什么?原因有幾條(注意看,都能跟我們編程時的道理聯系上,所以說萬物都是想通的)

司令發出的命令通常都是很大的任務,往往要跨越很多部隊甚至兵種,如果讓司令一個一個通知不是要累死?(高層抽象不應該直接與底層實現耦合)

如果允許任意的跨級下達命令,那就很有可能導致多個上級同時給一個士兵下達不同的命令,那這個士兵不是要累死?(導致系統狀態不一致、或分布式系統的忙閑不一等情況)

士兵與直接上級之間的溝通通常是無障礙的,但跨級就難說了。哪個士兵擅長做什么事只有他的直接上級最清楚,跨級下達命令時可能會導致任務完成效率下降、甚至任務無法完成的后果(高層抽象往往難以駕馭底層細節,進而導致使用不當甚至誤用)

職能劃分明確

部隊會按地域、時域、部門、兵種等來劃分整個部隊的職責,這樣一層一層、一塊一塊地把整個部隊分成職責明確的一個個小部分,各個部分相對獨立又是一個有機整體,因此想不高效都很難啊。

另一個例子:

如果你有做電學實驗的經歷,這個概念就太好解釋了。兩塊電路板之間的接線就是耦合,接線越多,電路越復雜,以至于連電路設計者自己都被繞蒙了。一旦發現錯誤,頭緒太多很難理清,即所謂維護性變差。想往電路里接入更多板子難度也會加大,即所謂擴展性變差。就算勉強把電路跑通了,同樣的接線方法也很難在其他電路中復制,即所謂復用性差。這就是高耦合的壞處。

盡管耦合有種種壞處,但是又不可避免,因為沒有耦合電路就跑不起來。怎么辦呢?有個解決方法就是把耦合性盡可能藏起來。一塊芯片內部電路極其復雜,但是對于外界來說它的內部電路無關緊要。這種把耦合性盡可能藏起來的做法就叫解耦,對內部而言就是高內聚,對外界而言就是低耦合。邏輯效果上就是進行了一層抽象。使得外部可以把芯片視作一個整體,只需要關心它有哪些接口,而這些接口,實際上也是耦合,只不過已經是最小化的耦合了。

有了這樣一層抽象之后,工程師就可以不去關心具體的電路實現,玩純粹的邏輯。這就催生了編程語言。所以編程語言本身已經是在底層硬件解耦的基礎上所做的高度抽象了。而軟件工程中提到的狹義上的解耦,是指在編程語言(確切的說是用編程語言編制的程序)基礎上進行更高層次的解耦,從而獲得更高層次的抽象。這樣一層層解耦抽象上去,包括操作系統和應用軟件在內的整個軟件大廈就建造出來了。但是追根溯源,耦合與解耦概念的起源還是在硬件層次上,而軟件本身其實就是經過解耦的硬件基礎上的抽象。

另外解耦是一個過程,在軟件工程中體現為以高內聚低耦合為原則對代碼進行重構。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容