JavaScript全講-架構原則解析

gardener2 8年前發布 | 8K 次閱讀 JavaScript開發

來自: http://my.oschina.net/aricchen/blog/625249


由于最近一直在忙,很久沒有更新,見諒。


上篇我們講完JavaScript函數式編程的特性,今天我們就來聊聊JavaScript中的架構。


提到JavaScript架構,很多人會覺得不可思議,因為架構多是針對類似Java這種強語言,而JavaScript一直被看成是弱語言,它有設計模式,可以用來構建架構嗎?


答案無疑是肯定的! 設計模式本身是一種很重量級的東西,當JavaScript被當做輔助使用時,談架構反而會增加復雜度! 所以這么多年,大家并沒有看到JavaScript關于設計模式,架構之類的文章。而現今Web的發展,前端越來越重要,自然而然會推動JavaScript關于設計模式,架構方面的發展。


由于JavaScript和Java的截然不同,在討論設計模式時,我們不能直接套用Java中關于設計模式的講解方法,而是從另一方面來講解。設計模式的SOLID原則鼎鼎大名,今天我們就通過SOLID原則來透析JavaScript中的架構。


1. 單一職責(Single Responsibility)

簡單說,就是一個類只要負責一種職責即可,如果有多個職責需要處理,那就分離另外一個類。


之前我們有講過JavaScript的面向對象特性,通過對象的封裝,我們可以把單一職責在一個對象實現即可。這就完美符合了單一職責。

這么說起來,很多程序員肯定會很鄙視,這有什么好說的? 其實單一職責表面上很簡單,任何人都能信手拈來,但是它作為設計原則中最基礎的原則,是有原因的!


封裝并不困難,困難的是在任何時候能準確的分離職責。舉個例子:

單就系統登錄功能,我們把它作為一個職責來看! 但是隨著需求的復雜,會有更多的情況出現:

添加了驗證碼功能,要不要分離職責?

添加用戶有效期驗證,要不要分離?

增加用戶郵箱驗證功能,要不要分離?

如果你一直不分離,隨著需求的增加,你會被拖入萬劫不復的境地,不要認為這是危言聳聽! 但是反過來說,要如何分離,如何做到恰到好處的分離,是需要多年軟件經驗才能做到的。


基礎招式的出神入化,雖不能讓你殺敵于千里之外,但會讓你立于不敗之地!


2. 開閉原則,對擴展開放,對修改關閉(Open Close)

這個原則聽起來比較含蓄。通常程序的表現形式是繼承! 即有一個公共的父類,任何子類想要實現特殊的需求,都只要重寫或者增加方法即可。實現起來,就是設計模式中的模板方法,別名鉤子方法。

JavaScript是支持繼承的。我們就用偽代碼來解釋如何實現模板方法,并且在子類中重寫。


這種方式是開閉原則最直接的體現! 從偽代碼可以體會到,只要基礎功能不變,我們都不需要修改Base類,而只要擴展其功能即可。


3. 里氏替換原則(Liskov Substitution

聽起來更加含蓄了!用簡單的話說,就是不要瞎搞! 

就如上面的例子,你的需求FormView大部分都能實現,所以需要繼承FormView。但是你又有一個需求,功能和FormView壓根不沾邊,但是你強行繼承FormView,全部重寫來來實現自己的代碼,這就是亂搞了。


 里氏替換,就是在任何時候,用父類直接代替子類,都能實現大部分功能,上面的亂搞方式,父類根本不能替換子類使用,就違背了該原則。


4. 接口隔離(Interface Segregation

同單一職責思想差不多,單一職責是面向內部,即如何分離職責。而接口隔離,是如何提供更好的外部接口。

這個外部不是指WebService形式的接口,而是指類向外暴露的功能接口。

說簡單點,就是不要讓一個類過于龐大混亂,只負責一部分功能。讓其他使用的人可以清晰的分辨。


5. 依賴倒置(Dependence Inversion

高層不能依賴底層,其實很多人并不能什么叫高層,什么叫底層!這樣學術的話,只能誤導很多的新手。我們簡單來說:這里的高層和底層就如建大廈,高層如果是23層,那么底層就是22層,建大廈時,23層一定要依賴于22層(這不是廢話嗎)


那么,套用到軟件中,功能A和功能B,功能A依賴功能B,即功能A中需要調用B的接口,那么我們可以說:功能A是依賴于功能B,功能A是高層,功能B是底層。

那么如何理解“不能依賴”呢? 大廈的23層如果不能依賴22層,那不是扯淡嗎?

在軟件中,一個模塊過多依賴于其他模塊,那么它就是一團亂麻的中心點,為什么這么說呢?

假如模塊A依賴很模塊,偽代碼就如下


這樣的代碼在軟件后期對開發者就如噩夢一般。B C D模塊的任何修改都有可能引起A代碼的改動,可能很多開發者說,我的功能很簡單,不會修改的! 如果是這樣,基本證明你的軟件,要么不是給人用的,要么就是沒人用!


那么如果我們不能直接使用依賴,要如何處理這種代碼引用呢?

伴生依賴倒置的模式,就是依賴注入!這個可真是大名鼎鼎,Spring的基礎之一。沒有它,在現在來說,我們根本沒辦法寫代碼了。

它的核心思想也很簡單,類似于我們去吃自助餐,我想吃牛扒,直接去拿就好了,不用我去烹飪。

用程序的語言來講,我想吃牛扒,是我要依賴牛扒,本來我要親手new一個牛扒,但是這時候由于有了廚師,我直接拿來吃就可以了。所以別名依賴倒置。

如果這時候,我都不用去拿牛扒,廚師直接送過來,這叫依賴注入!

我的牛扒吃完之后,師傅拿回去,直接給別人再繼續吃,這叫單例注入,雖然有點惡心,但是很高效率!萬一上面有異物(被別人修改了),這叫單例污染!

師傅每天預先做10個牛排,誰要給誰送去!這叫單例池,類似于連接池。

依賴注入在在我們平時的開發中處處可見,這里大家只要理解其思想即可。接下來,我們就要講講在JavaScript中如何實現依賴注入了?這里只用其偽代碼實現其簡單的思想


隨著各種JS MVC框架的流行,依賴注入也在前端越來越流行,目前做的最好的就屬AngularJS!有興趣的同學可以深入學習。


上面五個原則的首字母拼在一起就是SOLID,構成了軟件穩固的架構。


大家可能會發現五個原則都是非常簡單的原理,事實也確實如此。但是熟練掌握并且靈活運用到軟件中,卻不是一件簡單的事情。尤其它的表現形式-設計模式,復雜多變,很多更是雌雄同體,根本分不清楚,讓我們困惱不堪,同時又讓廣大程序員欲罷不能,真真是痛并快樂著。


JavaScript作為面向對象的語言,具備實現架構的條件,類似BackBone,AngularJS等MVC框架已經逐漸引領前端。隨著它們的持續發展,前端開發終將像Java一樣可控,這對所有開發人員都是一大福音。


最后送給所有程序員一句話:如果你想的太多,那是因為你代碼寫的太少。













 本文由用戶 gardener2 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!