分享以前,想說一下爲何選擇了「架構」這個主題,其實初衷有兩個:html
第一,「架構」對於咱們來講實在是過重要了,我們雖然沒有架構師這個職位,可是在開發的時候,都須要先有個很好的設計,但願咱們的代碼是易維護的,而「設計」每每都會落到「架構」上。因此但願此次分享可以對於你們在架構設計上有一點幫助。react
第二,即使「架構」如此的重要,你們再聊到「架構」這個話題的時候,仍是感受到有點「虛」。想一想緣由,多是由於每一個人對於「架構」的理解可能都不太同樣,一我的在不一樣階段對於「架構」的理解也會不同,架構設計還很依賴於實踐和經驗,不少設計細節(取捨)都是在實踐中不停的迭代、改進,進而反思才能獲得價值觀的升級。因此我藉此次機會,也將我本身以前零散的架構方面的理解,總結一下,爭取能造成一點體系上的認識。但願你們聊起架構時,能稍微不那麼「虛」。ios
爲了避免那麼枯燥,今天分享形式,我選了3個架構的案例,來進行分析,來試圖講清楚我對於架構的認識,以及怎麼樣設計出一個好的架構,固然這個話題太大了,我今天先給你們開個頭,但願先能有一點感受就好。面試
最後但願你們帶着批判的精神來聽,歡迎多交流。算法
第一個案例,舉一個咱們本身的,放在第一個來說,也是想強調「懂業務」對於設計出好的架構來講,是很是重要的,這也是一些人每每會忽略的點。數據庫
不少同窗確定想,在項目的一開始,就設計一個完美的架構,之後能 hold 住各類變化。其實這是不可能的,架構必定是隨着業務的變化,而不停的演化和進化的,在有的階段還可能對於以前架構作比較大的調整。react-native
你們都知道,咱們同時維護了幾個App,好比小豹、小雅、錘子等,這些上層App,都要依賴於底層的一些framework,好比設計模式
在早些的時候,咱們對於 SDK 的拆分粒度比較細,好比一個「找手機」技能,都會作成一個 framework。當時的 framework,應該在20個左右,各個 framework(組件) 的依賴關係圖以下:服務器
咱們這麼作當時的緣由很簡單,但願可以解耦各個組件,將組件儘可能拆細,而後App方想使用什麼功能均可以作到熱插拔,很少也很多,多好~網絡
理想和現實每每會出現矛盾,到實際應用的時候,這樣的設計就給咱們帶來了問題。若是對每一個 framework 進行編號,好比1到20,那麼咱們理想中是這樣的:
可是現實實際上是這樣的:
對比兩張圖的含義就是,實現中咱們各個App,使用的 framework 大致相同,咱們即使把業務拆的很細,若干個被拆分的 framework 其實還老是綁在一塊兒使用。而且,還給咱們維護帶來了巨大的問題,光每次打Git tag,都要折騰一會,會感受精力都花在了一塊兒輔助工做上。
針對這個問題,咱們專門優化了 framework 的個數,將類似業務的 framework 進行了合併,最終 framework 的數量減小到了10個一下,組件之間的依賴圖變成這樣:
優化以後效果也很明顯,咱們對於各個framework的維護,變得簡單多了。
另外在優化的過程,有兩個值得一提的是:
咱們談」架構「的時候,說的最多的就是」取捨「,什麼叫」取捨「,就是說你不能很簡單的就判別出哪一個是好的,哪一個是很差的,老是以爲有點左右爲難。而如何取捨?業務就是很是重要的一個標杆,只有結合業務,才能判斷出哪一個是最適合本身的。咱們結合了業務,對本身的 framework 的數量進行了精簡,固然也可能會根據業務的變化,在將來某天,須要將現有的framework拆分的更細。
你作的項目,技術架構是怎麼樣的?
幾乎全部人在被面試或者面試別人的的時候,都會(被)問到這個問題,不少人會回答,咱們架構是MVC(MVVM),少數人還會使用MVP或者VIPER,咱們姑且都稱爲MV(X),可是真的架構僅僅就是MV(X)嗎?其實我以爲MV(X)雖然是架構中比較重要的部分,可是仍是遠遠不能說架構 = MV(X)。
爲何呢?帶着這個問題,咱們來看第二個例子,在這個案例中,咱們關注下面幾點:
文章地址:
餓了麼移動APP的架構演進
https://www.jianshu.com/p/2141fb0dc62c
」餓了麼「的架構經歷了4個階段的演化:
這個古老而經典的模式,不用多說。它是一個軟件」從無到有「,」短平快「開發的首選。也是大部分規模比較小的 App 幾乎大部分時間精力都會與之打交道的一個架構,以致於人們提架構比彈MVC。
固然這個架構隨着業務的劇增,很快就會出現弊端,朝着Massive-View-Controller的方向奔去。
隨着代碼量不斷增長,功能模塊愈來愈多,無論是分工開發協做,仍是已有模塊的複用和維護,組件化都成了這個階段的重點。組件化有個兩個關鍵:
對於第一個問題,」餓了麼「採用的方案,基本是業界廣爲使用的分類方案,將組件分爲共有組件和業務組件,
對於兩種組件的管理:
而在具體某個業務組件內部,則能夠根據不一樣開發人員,不一樣隊伍的偏好,來實現不一樣的代碼架構,好比MVC、MVVM、MVP等,也都不會影響總體系統架構。
這時的架構圖,看上去長這樣:
咱們能夠看到,MV(X) 已經不是關注的所有了,不少模塊已經和 MV(X) 不怎麼搭邊了。
因此說,架構不等於 MV(X),其實 MV(X) 關注的只是」應用層「的部分。
關於分層:
通常的,能夠將App分爲三層:應用層、service層、data access層。
- 應用層 是直接和用戶打交道的部分,咱們經常使用到的 UIViewController,Android的 Activity,負責了數據的展現、流向、用戶交互的處理。
- service 層 是在應用層的下面,爲應用層服務器的,對於應用層來講就像一個API調用延遲爲0ms的Server API。通常會放在應用層的代碼:網絡接口調用、公共系統服務API(GPS定位、隱私權限訪問)、一些 UTil 代碼(因此我以爲好比一個 UIViewController 的一些私有方法和一些提工具性質的category,其實應該算serveice 層)。
- data access 提供和對於數據的」增刪改查「的接口層。
業務的變化又來啦,當用戶規模達到比較大的數量,此次不只僅是功能的增長,每兩週一版已經知足不了產品、運營躁動的心了;同時,用純 Native 代碼編寫的 App,若是上線後有錯誤,只能等下一次提交市場。在現在互聯網競爭如此激烈的時代,一次線上錯誤有時也會帶來很大的影響。因此這時候,不少純粹展現性的模塊會使用 H5 的方式來實現。
可是這種方式也有它的弊端:
對於這個問題,也有不少方案能夠權衡,好比能夠提早將網頁打包好,以減小網絡傳輸的時間,同時提供一系列的插件來訪問本地的硬件設備。
「餓了麼」這裏的作法是,綜合了 Native 和 H5 的優缺點,將頁面作了一個劃分,純粹展現性的模塊使用 H5;而更多的數據操做、動畫渲染性的模塊使用 Native。
架構圖長成這樣子:
業務再一次再架構的演化中扮演了重要的角色。
又要頻繁迭代,又要用戶體驗,這時就考慮到了RN;另外,餓了麼這個階段用戶已通過億,線上一個小 bug 均可能影響幾萬人的使用,因此這個階段,重點在於 RN 模塊的引入,以及 Hot Patch 熱修復功能的引入。
在 RN 的使用方面,依然有一個取捨,要回答下面的問題:
「餓了麼」的作法是:對於20%最重要的頁面,作了一個 RN 的鏡像,也就是一個備份,而後經過服務器的配置,來切換Native 仍是 RN,這樣若是 Native 頁面出現問題的時候,先經過開關將線上的頁面切換成 RN,先保證線上正常使用,而後使用 Hot Patch 完成修補後,再切換回 Native App 原生頁面。
這時的架構圖:
不得不說,這種作法不必定適合別的團隊,畢竟一個頁面,要寫 Native 、 RN 兩套代碼,而且要一直維護,花的代價都有點大,不是每一個團隊都有精力去這麼搞的。其實這點,也正說明了,你須要根據本身業務,設計出一個最適合本身項目的架構。
小結一下:
第三個案例咱們迴歸 MV(X),畢竟它確實是咱們平常開發接觸比較多的一部分。
對了這個案例,想關注的「點」是
文章地址:
猿題庫 iOS 客戶端架構設計
http://gracelancy.com/blog/2016/01/06/ape-ios-arch-design/
優勢:
缺點:
其實對於上面這個缺點,唐巧也在一篇文章中寫道,這個問題其實也不能說是 MVC 的缺點,是咱們沒有拆分好代碼。能夠看看唐巧的《被誤解的 MVC 和被神化的 MVVM》,提出了一些如何解決 Controler 臃腫的解決辦法,而後也表達了對於 MVVM 的質疑,具體的作法能夠去讀這篇文章。這也正說明了你們對於架構的理解和態度真的是有區別的。
具體關於MVVM的概念能夠參考 Objc 的《MVVM 介紹》,這裏就不具體說 MVVM 的概念了。
不瞭解MVVM的同窗,知道這幾點就行:
優勢:
缺點:
來看下 Lancy 的設計,是如何將二者綜合,規避缺點,保留優勢的,先上圖:
對於上圖的說明:
結合產品 UI,再按照數據流的方式闡述,如下面的 CollectionView 爲例。
這麼方式的優缺點:
優勢:
缺點:
針對這個案例,我以爲最應該咱們思考的就是,做者 Lancy,在設計架構的時候的思路是怎麼樣的?爲何要那麼設計?是怎麼取捨的?總結一下:
基於對這個案例的分析,最應該思考的是,設計一個架構的思路,換言之,你要內心明白,怎樣纔是一個好的架構。
總結一下,今天說的這三個案例,其實就是爲了說明一下幾點:
其實「架構」真的是個很大的話題,不少知識均可以拿出來單獨學習和分享。
但願之後能陸續的爲你們分享,擅長哪一個方向,或者對哪一個方向感興趣的小夥伴也能夠給你們分享一下,讓你們的設計能力一點點提升上來。
MVVM 介紹
https://objccn.io/issue-13-1/
被誤解的 MVC 和被神化的 MVVM
http://blog.devtang.com/2015/11/02/mvc-and-mvvm/
iOS應用架構談系列
https://casatwy.com/iosying-yong-jia-gou-tan-kai-pian.html
猿題庫 iOS 客戶端架構設計
http://gracelancy.com/blog/2016/01/06/ape-ios-arch-design/
餓了麼移動APP的架構演進
https://www.jianshu.com/p/2141fb0dc62c
iOS應用層架構之CDD
http://mrpeak.cn/blog/cdd/
iOS應用架構現狀分析
http://mrpeak.cn/blog/ios-arch/
iOS 架構模式–解密 MVC,MVP,MVVM以及VIPER架構
http://www.cocoachina.com/ios/20160108/14916.html