JavaScript全講-架構原則解析

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


上篇我們講完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一樣可控,這對所有開發人員都是一大福音。


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












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章