軟件雜談(1)- 解耦


-前言-

軟件雜談是大叔打算寫的關于軟件的隨筆系列,多數是在開車行路中冒出的想法,又怕年紀大了忘卻,便記下來。

有些人天生就喜歡寫作或記錄生活,這當然是個很好的習慣,而我卻不太擅長。在我看來,靜下心寫一些東西是很奢侈的事情,每天奔波,很少能給自己擠出一點時間。

最近流行一句話:“貧窮限制了你的想象力”。忙碌又何嘗不是?忙碌更像是鴉片,會使人習慣甚至麻木。你看,這世界上是不是中國人最勤勞忙碌,也恰巧是中國人最缺乏想象力,忙得沒時間思考,沒時間想象。

大叔很忙,可還有那么一個私密時間屬于我獨有,那便是開車的時候,安靜且沒人打擾。

這還要“感謝”我大西安的交通擁堵,別人抱怨,我卻很享受。每天至少在車里度過兩個小時,除了思考,還能做些什么?

當然,這種享受要對老司機來說才是這樣,因為只有老司機才能騰出大腦,邊開車邊思考。

大叔搞軟件技術20多年,駕齡15年,當然是老司機了(相信你沒有想歪)。

言歸正傳,既是雜談,便無有順序可言,想到哪里聊到哪里。也無有題材限制,只要跟軟件技術相關,都可以聊。

這一篇我們先聊一個詞--“解耦”。

選解耦為關雎,還是有原因的,因為在大叔眼里,解耦太重要了。

重要到什么程度?基本上只要掌握好解耦,軟件開發內功的任督二脈就基本打通了。

-概念-


解耦這個詞譯自英文decouple,翻譯的非常好。

從詞義上看:

解者,拆也,分也,離也,斷也。

偶者,索也,合也,并也,緣也。

解耦,顧名思義就是降低軟件體之間的耦合度,直至徹底斷耦的過程。

我們這里所說的軟件體,是指具有相對獨立性的軟件功能集合。可以理解為某個函數體或者模塊,或更多的指可重用的服務和組件。

那么什么是耦合與耦合度呢?

所謂耦合,是指兩個或多個軟件體之間的依賴關系。耦合度就是這種相互依賴關系的強弱程度。

耦合度越高,軟件體之間的牽連羈絆就越多,依賴性就越大,反之則反。

例如,一個組件,依賴于另一個組件才能夠運行,那么就說這兩個組件之間存在耦合。倘若一個組件依賴于它運行的環境才能夠運行,那么就說這個組件跟環境之間存在耦合。

-思想由來-


解耦不是某種語言或者技術特有的概念,解耦是一種普遍存在的思想。

解耦的思想由來已久,早在軟件可重用技術提出之前,硬件集成電路(IC)技術就普遍采取了解耦的技術。道理很簡單,每一個集成電路模塊在設計上必須具備獨立性,標準性和解耦性,才能夠像搭積木一樣構建出復雜的系統。

伴隨著軟件可重用思想及相關技術的產生,接口和解耦的概念也應運而生。軟件組件以及基于組件的開發(Component Based Development - CBD)要求組件能夠像集成電路一樣獨立存在,通過事件松散耦合。由此發展出的一系列組件模型,都是解耦思想的完美實例。例如Enterprise JavaBeans (EJB)模型,Component Object Model (COM)模型,.NET模型等等。

在面向服務的架構(Service Orientation Architectures - SOA)中,也需要軟件服務相互獨立,沒有耦合。

還有這些年流行的微服務,前后端分離,也是這樣。

云計算以及云平臺,也處處體現著解耦思想。例如,基礎設施即服務 (IaaS)、平臺即服務 (PaaS) 和軟件即服務 (SaaS)等技術中都體現著熱插拔,松耦合,資源動態分配整合的特點。

-耦合的影響-


軟件體之間存在耦合,會增加軟件實現的復雜度。

耦合像一種無形的力量,束縛著軟件結構的健康。不經思考的隨意耦合,可能造成內部邏輯混亂,難以糾正,有如三千煩惱絲,剪不斷理還亂。

高耦合度的軟件系統,閱讀起來一定困難,維護成本一定提高,復雜度隨之也高,也會導致質量的下降。

佛教思想中有十二因緣的理論,講述由無明引起的環環相扣、因果相隨的輪轉生死過程。串接苦趣每一環節的是緣,要想獲得自由、脫離生死,就要認識緣斷了緣。

類似的,耦合的本質也是緣。而正是這種牽絆,造成系統復雜乃至生出種種問題和痛苦。

-解耦的本質-


既然耦合的本質是緣,那么解耦的本質就是斷緣,并通過斷緣提升軟件體的自由。

沒錯,是自由!

自由會帶來活力,自由會引發包容開放,自由會促進事物健康發展。

沒想到這個充滿人文思想的因素,在軟件系統中也是這樣。

一個國家缺少自由,必然會走向滅亡。一個軟件系統缺少自由,必然會問題百出并導致失敗。

原諒我這一生不羈放縱愛自由,大叔之所以把解耦放到第一篇來講,也有這個原因,解耦太重要了,自由太重要了

-解耦的方法-


實際上,軟件體之間不可能沒有聯系,否則我們靠什么把它們串接起來。

我們要拆解的不是依賴關系,而是要打破對某個具體實相的依賴,也就是對某個具體的軟件體的真實性的依賴。這句話不拗口吧?

怎么打破?答案就是抽象和接口。

通過抽象和接口,依賴關系的實體消亡,軟件體除了自身表現出內斂性外,一切對外的認知都建立在抽象和接口之上。

不著相,保持自性清凈,是通達精神自由的方法。在解耦層面,亦復如是。

當軟件體之間徹底斷耦,它們中的每一部分就處于獨立存在的狀態。我們甚至可以把其中的任何一個替換掉,而不會影響整體正常工作。對整個系統而言,也帶來了更大的自由度。

我們時常聽到的依賴倒置,控制反轉,依賴注入,面向接口編程這些概念,都是在抽象和接口依賴的關系上建立和實現的。

其實你可能每天都在接觸解耦,只是自己也要用好解耦而已。

-解耦的人文精神-


一個耦合度小的軟件設計和實現,無論從結構上還是細節上都會帶給人賞心悅目的感覺。這種由內向外透出的美感,很大程度上就源于解耦后的軟件體所具有的獨立性和自由性。

而獨立性和自由性,正是現代文明中的人類追求的精神價值和目標。

正如陳寅恪先生題寫在《清華大學王觀堂先生紀念碑銘》中的十個大字:“獨立之精神 自由之思想”,時刻提醒著我們要在求知的道路上樹立獨立自由的精神。

作為軟件工作者,想寫出好的軟件,也需要力求把這種獨立自由的人文精神賦予在軟件作品當中。

不自由,毋寧死。此時,解耦就顯得尤為重要。

希望大家能夠理解并應用好解耦,寫出層次清晰,結構靈活,質量可靠,優美的軟件。


-2018.03.31 蘭山 -




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

推薦閱讀更多精彩內容