-前言-
軟件雜談是大叔打算寫的關于軟件的隨筆系列,多數(shù)是在開車行路中冒出的想法凝危,又怕年紀大了忘卻岁疼,便記下來阔涉。
有些人天生就喜歡寫作或記錄生活,這當然是個很好的習慣捷绒,而我卻不太擅長瑰排。在我看來,靜下心寫一些東西是很奢侈的事情暖侨,每天奔波椭住,很少能給自己擠出一點時間。
最近流行一句話:“貧窮限制了你的想象力”字逗。忙碌又何嘗不是京郑?忙碌更像是鴉片,會使人習慣甚至麻木葫掉。你看些举,這世界上是不是中國人最勤勞忙碌,也恰巧是中國人最缺乏想象力俭厚,忙得沒時間思考户魏,沒時間想象。
大叔很忙挪挤,可還有那么一個私密時間屬于我獨有叼丑,那便是開車的時候,安靜且沒人打擾扛门。
這還要“感謝”我大西安的交通擁堵鸠信,別人抱怨,我卻很享受尖飞。每天至少在車里度過兩個小時症副,除了思考,還能做些什么政基?
當然贞铣,這種享受要對老司機來說才是這樣,因為只有老司機才能騰出大腦沮明,邊開車邊思考辕坝。
大叔搞軟件技術20多年,駕齡15年荐健,當然是老司機了(相信你沒有想歪)酱畅。
言歸正傳琳袄,既是雜談,便無有順序可言纺酸,想到哪里聊到哪里窖逗。也無有題材限制,只要跟軟件技術相關餐蔬,都可以聊碎紊。
這一篇我們先聊一個詞--“解耦”。
選解耦為關雎樊诺,還是有原因的仗考,因為在大叔眼里,解耦太重要了词爬。
重要到什么程度秃嗜?基本上只要掌握好解耦,軟件開發(fā)內功的任督二脈就基本打通了顿膨。
-概念-
解耦這個詞譯自英文decouple锅锨,翻譯的非常好。
從詞義上看:
解者虽惭,拆也橡类,分也,離也芽唇,斷也顾画。
偶者,索也匆笤,合也研侣,并也,緣也炮捧。
解耦庶诡,顧名思義就是降低軟件體之間的耦合度,直至徹底斷耦的過程咆课。
我們這里所說的軟件體末誓,是指具有相對獨立性的軟件功能集合∈轵剑可以理解為某個函數(shù)體或者模塊喇澡,或更多的指可重用的服務和組件。
那么什么是耦合與耦合度呢殊校?
所謂耦合晴玖,是指兩個或多個軟件體之間的依賴關系。耦合度就是這種相互依賴關系的強弱程度。
耦合度越高呕屎,軟件體之間的牽連羈絆就越多让簿,依賴性就越大,反之則反秀睛。
例如尔当,一個組件,依賴于另一個組件才能夠運行琅催,那么就說這兩個組件之間存在耦合居凶。倘若一個組件依賴于它運行的環(huán)境才能夠運行,那么就說這個組件跟環(huán)境之間存在耦合藤抡。
-思想由來-
解耦不是某種語言或者技術特有的概念,解耦是一種普遍存在的思想抹估。
解耦的思想由來已久缠黍,早在軟件可重用技術提出之前,硬件集成電路(IC)技術就普遍采取了解耦的技術药蜻。道理很簡單瓷式,每一個集成電路模塊在設計上必須具備獨立性,標準性和解耦性语泽,才能夠像搭積木一樣構建出復雜的系統(tǒng)贸典。
伴隨著軟件可重用思想及相關技術的產生,接口和解耦的概念也應運而生踱卵。軟件組件以及基于組件的開發(fā)(Component Based Development - CBD)要求組件能夠像集成電路一樣獨立存在廊驼,通過事件松散耦合。由此發(fā)展出的一系列組件模型惋砂,都是解耦思想的完美實例妒挎。例如Enterprise JavaBeans (EJB)模型,Component Object Model (COM)模型西饵,.NET模型等等酝掩。
在面向服務的架構(Service Orientation Architectures - SOA)中,也需要軟件服務相互獨立眷柔,沒有耦合期虾。
還有這些年流行的微服務,前后端分離驯嘱,也是這樣镶苞。
云計算以及云平臺,也處處體現(xiàn)著解耦思想宙拉。例如宾尚,基礎設施即服務 (IaaS)、平臺即服務 (PaaS) 和軟件即服務 (SaaS)等技術中都體現(xiàn)著熱插拔,松耦合煌贴,資源動態(tài)分配整合的特點御板。
-耦合的影響-
軟件體之間存在耦合,會增加軟件實現(xiàn)的復雜度牛郑。
耦合像一種無形的力量怠肋,束縛著軟件結構的健康。不經思考的隨意耦合淹朋,可能造成內部邏輯混亂笙各,難以糾正,有如三千煩惱絲础芍,剪不斷理還亂杈抢。
高耦合度的軟件系統(tǒng),閱讀起來一定困難仑性,維護成本一定提高惶楼,復雜度隨之也高,也會導致質量的下降诊杆。
佛教思想中有十二因緣的理論歼捐,講述由無明引起的環(huán)環(huán)相扣、因果相隨的輪轉生死過程晨汹。串接苦趣每一環(huán)節(jié)的是緣豹储,要想獲得自由、脫離生死淘这,就要認識緣斷了緣剥扣。
類似的,耦合的本質也是緣慨灭。而正是這種牽絆朦乏,造成系統(tǒng)復雜乃至生出種種問題和痛苦。
-解耦的本質-
既然耦合的本質是緣氧骤,那么解耦的本質就是斷緣呻疹,并通過斷緣提升軟件體的自由。
沒錯筹陵,是自由刽锤!
自由會帶來活力,自由會引發(fā)包容開放朦佩,自由會促進事物健康發(fā)展并思。
沒想到這個充滿人文思想的因素,在軟件系統(tǒng)中也是這樣语稠。
一個國家缺少自由宋彼,必然會走向滅亡弄砍。一個軟件系統(tǒng)缺少自由,必然會問題百出并導致失敗输涕。
原諒我這一生不羈放縱愛自由音婶,大叔之所以把解耦放到第一篇來講,也有這個原因莱坎,解耦太重要了衣式,自由太重要了。
-解耦的方法-
實際上,軟件體之間不可能沒有聯(lián)系,否則我們靠什么把它們串接起來鄙陡。
我們要拆解的不是依賴關系,而是要打破對某個具體實相的依賴住册,也就是對某個具體的軟件體的真實性的依賴。這句話不拗口吧烫葬?
怎么打破界弧?答案就是抽象和接口。
通過抽象和接口搭综,依賴關系的實體消亡,軟件體除了自身表現(xiàn)出內斂性外划栓,一切對外的認知都建立在抽象和接口之上兑巾。
不著相,保持自性清凈忠荞,是通達精神自由的方法蒋歌。在解耦層面,亦復如是委煤。
當軟件體之間徹底斷耦堂油,它們中的每一部分就處于獨立存在的狀態(tài)。我們甚至可以把其中的任何一個替換掉碧绞,而不會影響整體正常工作府框。對整個系統(tǒng)而言,也帶來了更大的自由度讥邻。
我們時常聽到的依賴倒置迫靖,控制反轉,依賴注入兴使,面向接口編程這些概念系宜,都是在抽象和接口依賴的關系上建立和實現(xiàn)的。
其實你可能每天都在接觸解耦发魄,只是自己也要用好解耦而已盹牧。
-解耦的人文精神-
一個耦合度小的軟件設計和實現(xiàn),無論從結構上還是細節(jié)上都會帶給人賞心悅目的感覺。這種由內向外透出的美感汰寓,很大程度上就源于解耦后的軟件體所具有的獨立性和自由性口柳。
而獨立性和自由性,正是現(xiàn)代文明中的人類追求的精神價值和目標踩寇。
正如陳寅恪先生題寫在《清華大學王觀堂先生紀念碑銘》中的十個大字:“獨立之精神 自由之思想”啄清,時刻提醒著我們要在求知的道路上樹立獨立自由的精神。
作為軟件工作者俺孙,想寫出好的軟件辣卒,也需要力求把這種獨立自由的人文精神賦予在軟件作品當中。
不自由睛榄,毋寧死荣茫。此時,解耦就顯得尤為重要场靴。
希望大家能夠理解并應用好解耦啡莉,寫出層次清晰,結構靈活旨剥,質量可靠咧欣,優(yōu)美的軟件。
-2018.03.31 蘭山 -