內容來源:2018 年 3 月 10 日,今日頭條-Musically IOS端架構師任凱在「餓了麼技術沙龍・第22彈 【移動專場】」進行《IOS架構設計雜談》演講分享。IT 大咖說(微信id:itdakashuo)做爲獨家視頻合做方,經主辦方和講者審閱受權發佈。
服務器
閱讀字數:2842 | 8分鐘閱讀微信
本次分享將探討iOS中的架構設計,講解工程設計的6大原則,經過一個簡單登錄界面,一步步分析開發中的MVVM框架應用。網絡
目前開發團隊的人員愈來愈多,應用運營起來以後業務需求和功能需求日益增加,在沒有良好的架構設計的狀況下,維護起來會愈加困難,所以架構設計是應用開發中不得不思考的問題。架構
這是一段很是簡單的代碼,它啓動了App初始化了Applocaltion對象,而後分發各類事件到實現的API內。這套代碼背後是RunLoop的死循環,在主線程上驅動整個App進行UI事件的處理,分發給相應的API。框架
若是沒有API封裝和UI Kit架構設計,那麼在main函數內實現一個簡單的按鈕都是很是麻煩的。 函數
歸根結底架構設計的目的是爲了下降業務開發門檻,使業務開發更容易,使工程代碼易懂易維護。工具
要想作工程架構首先要對代碼有追求,DRY和Kiss這個兩個原理相信你們對有所接觸。DRY即Don’t repeat yourself,也就是不要在工程內複製粘貼;Kiss即Keep It Simple,Stupid,架構設計不是爲了追求炫酷和複雜度而是要讓工程架構更簡潔易懂,隱藏複雜的細節提供易用的API。oop
Solid原則,是針對面向對象的程序設計提出的,即便在反思面向對象一些問題的如今,這一原則內的不少東西也有很重要的參考意義。線程
單一功能原則,不要考慮在模塊內實現與它不相關的功能,好比在一個類中既要處理string MD5又要處理圖片的解壓縮,這就是明顯的違反單一功能原則的例子。再往細說,其實在方法內也不該該處理過多的事情。架構設計
開閉原則,設計模塊時要考慮對擴展開發對修改封閉,簡單理解就是提煉不變的邏輯,將穩定的部分封裝成模塊的核心邏輯,對可擴展的部分進行注入。
里氏替換原則,指的是全部的子類均可以替換父類,可是通常狀況下咱們是不會經過子類去破壞父類的邏輯。
接口隔離原則,對於client應該隱藏不須要的細節,隔離這些部分不去依賴它們,使API的依賴更加簡潔。
依賴反轉原則,指的是高層次的模塊不該依賴低層次的模塊,我的認爲這是個僞命題,由於高層次的模塊一旦依賴低層次的模塊,那它就不是高層次的模塊了。若是高層次模塊確實須要依賴某些東西的時候,所依賴的東西應該是抽象的。
最少知識原則,開發人員在使用模塊的時候,對該模塊知道的越少才越好。
這六大原則其實翻來覆去都是在講兩件事情,一個是易理解的API設計,另外一個是創建合理依賴關係。
基於以上的原則前人已經總結出了一些方法論,好比MVC,MVVM,Viper,這些實際上是模塊拆分角色設計的經驗,固然這些是GUI層的,不過在其餘的層面也能夠有本身的角色拆分的經驗。
MVVM中最令我興奮的是有ViewModel這個角色,由於ViewModel比蘋果的MVC設計中的Controller更小,同時又能處理業務邏輯,當業務邏輯拆分的足夠小和分散的時候,這些部分可複用的可能性更大。
ViewModel實際上是View的數據層的影子,它的神奇之處在於這個影子是能夠被改變而後映射到實體上。這個過程當中ViewModel抽象出UI的數據,而後將這些與UI上的屬性進行綁定。
GUI還有一個很重要的部分,就是ViewController。雖然咱們是想打破MVC,可是蘋果的UI Kit是基於MVC的設計理念,ViewController被賦予了很重要的角色,用來控制頁面跳轉、配置ViewModel和View的綁定。
Login設計要想貫穿MVVM理念大體邏輯是這樣的,LoginView有兩個textFile並分別將它們的text部分綁定到username和password上,這樣用戶在UI上操做,ViewModel層的數據就會進行同步的改變。而後將LoginView的LoginButton事件在ViewModel上作處理,當LoginButton事件觸發的時候,ViewModel能夠拋開UI層去作一系列的事件處理。
若是真的基於前面的設計去實現,而沒有引入第三方輔助,就會發現這實際上是很是複雜的事情。所以爲了開發功能更容易,須要引入第三方或者本身去提煉一些東西。
第一個能夠提煉的是Common UI,好比對於有類似樣式的控件,能夠提煉出共用的代碼做爲Common UI,達到組件複用的目的。處理完登陸後要將模型共享出去,這時能夠封裝一個AccountManager用來向服務器換取模型,其餘地方就能經過這個模型來獲取token或者用戶信息。
在UI Kit上作綁定並不容易,須要用ReactiveCOcoa或者RxSwift這樣的框架來將View和ViewModel綁定或者模型反序列化等等。
通過這樣的設計整個App的層級結構已經初步成型,最底層是App功能,在此之上是App通用業務層,這塊提供能夠相互使用的組件、模塊。再往上的iOS通用層中其實不少東西在iOS的其餘開發上都可以用到。
一般狀況下一個公司會有幾個App,在App中的一些通用邏輯也可能能夠給其餘App使用。通過MVVM的設計ViewModel和Model已經與App的UI解耦,能夠很輕鬆的將ViewModel往上提一個層次讓整個公司去使用,這時整個架構就會多出一個公司通用業務層。
整個過程當中MVVM指導了UI與業務邏輯組件拆分,UI與業務邏輯的解耦使得不一樣APP間的登陸功能有共用的組件,經過豐富的iOS通用層組件使綁定、網絡請求、數據反序列化變得更容易實現。
架構設計須要產出的重要結果是三個通用層有豐富工具、模塊,使大部分業務開發能夠經過組合通用層的模塊工具實現。
設計好模塊首先要了解設計原則,知道什麼狀況下會帶來糟糕的依賴,而且要堅持這些原則。還要了解經常使用模塊設計方法,好比對MVVM有比較深刻的理解就能對GUI層的邏輯作很好的拆分。最後也是最重要的一點就是不斷反思改進,其實就是遇到坑的時候思考下爲何怎麼坑。
在一個項目中執行好的設計原則或者優秀的設計,首先須要創建合理的工程文件結構,知道本身封裝好的組件應該放在哪裏。另外還要達成團隊架構設計共識,切勿悶頭開發。