今日頭條:iOS 架構設計雜談

IT大咖說發表於2018-06-21

今日頭條:iOS 架構設計雜談

內容來源:2018 年 3 月 10 日,今日頭條-Musically IOS端架構師任凱在“餓了麼技術沙龍・第22彈 【移動專場】”進行《IOS架構設計雜談》演講分享。IT 大咖說(微信id:itdakashuo)作為獨家視訊合作方,經主辦方和講者審閱授權釋出。

閱讀字數:2842 | 8分鐘閱讀

嘉賓演講視訊及PPT回顧:suo.im/4HHwpv

摘要

本次分享將探討iOS中的架構設計,講解工程設計的6大原則,通過一個簡單登陸介面,一步步分析開發中的MVVM框架應用。

為什麼要做架構設計?

目前開發團隊的人員越來越多,應用運營起來之後業務需求和功能需求日益增長,在沒有良好的架構設計的情況下,維護起來會越發困難,因此架構設計是應用開發中不得不思考的問題。

今日頭條:iOS 架構設計雜談

這是一段非常簡單的程式碼,它啟動了App初始化了Applocaltion物件,然後分發各種事件到實現的API內。這套程式碼背後是RunLoop的死迴圈,在主執行緒上驅動整個App進行UI事件的處理,分發給相應的API。

今日頭條:iOS 架構設計雜談

如果沒有API封裝和UI Kit架構設計,那麼在main函式內實現一個簡單的按鈕都是非常麻煩的。 

歸根結底架構設計的目的是為了降低業務開發門檻,使業務開發更容易,使工程程式碼易懂易維護。

怎麼做一個工程架構

程式碼追求

要想做工程架構首先要對程式碼有追求,DRY和Kiss這個兩個原理相信大家對有所接觸。DRY即Don’t repeat yourself,也就是不要在工程內複製貼上;Kiss即Keep It Simple,Stupid,架構設計不是為了追求炫酷和複雜度而是要讓工程架構更簡潔易懂,隱藏複雜的細節提供易用的API。

六大設計原則

Solid原則,是針對物件導向的程式設計提出的,即使在反思物件導向一些問題的現在,這一原則內的很多東西也有很重要的參考意義。

單一功能原則,不要考慮在模組內實現與它不相關的功能,比如在一個類中既要處理string MD5又要處理圖片的解壓縮,這就是明顯的違反單一功能原則的例子。再往細說,其實在方法內也不應該處理過多的事情。

開閉原則,設計模組時要考慮對擴充套件開發對修改封閉,簡單理解就是提煉不變的邏輯,將穩定的部分封裝成模組的核心邏輯,對可擴充套件的部分進行注入。

里氏替換原則,指的是所有的子類都可以替換父類,但是一般情況下我們是不會通過子類去破壞父類的邏輯。

介面隔離原則,對於client應該隱藏不需要的細節,隔離這些部分不去依賴它們,使API的依賴更加簡潔。

依賴反轉原則,指的是高層次的模組不應依賴低層次的模組,個人認為這是個偽命題,因為高層次的模組一旦依賴低層次的模組,那它就不是高層次的模組了。如果高層次模組確實需要依賴某些東西的時候,所依賴的東西應該是抽象的。

最少知識原則,開發人員在使用模組的時候,對該模組知道的越少才越好。

這六大原則其實翻來覆去都是在講兩件事情,一個是易理解的API設計,另一個是建立合理依賴關係。

基於以上的原則前人已經總結出了一些方法論,比如MVC,MVVM,Viper,這些其實是模組拆分角色設計的經驗,當然這些是GUI層的,不過在其他的層面也可以有自己的角色拆分的經驗。

MVVM案例

iOS MVVM實現方案

今日頭條:iOS 架構設計雜談

MVVM中最令我興奮的是有ViewModel這個角色,因為ViewModel比蘋果的MVC設計中的Controller更小,同時又能處理業務邏輯,當業務邏輯拆分的足夠小和分散的時候,這些部分可複用的可能性更大。

ViewModel其實是View的資料層的影子,它的神奇之處在於這個影子是可以被改變然後對映到實體上。這個過程中ViewModel抽象出UI的資料,然後將這些與UI上的屬性進行繫結。

GUI還有一個很重要的部分,就是ViewController。雖然我們是想打破MVC,但是蘋果的UI Kit是基於MVC的設計理念,ViewController被賦予了很重要的角色,用來控制頁面跳轉、配置ViewModel和View的繫結。

初步設計

今日頭條:iOS 架構設計雜談

Login設計要想貫穿MVVM理念大致邏輯是這樣的,LoginView有兩個textFile並分別將它們的text部分繫結到username和password上,這樣使用者在UI上操作,ViewModel層的資料就會進行同步的改變。然後將LoginView的LoginButton事件在ViewModel上做處理,當LoginButton事件觸發的時候,ViewModel可以拋開UI層去做一系列的事件處理。

進一步提煉

今日頭條:iOS 架構設計雜談

如果真的基於前面的設計去實現,而沒有引入第三方輔助,就會發現這其實是非常複雜的事情。因此為了開發功能更容易,需要引入第三方或者自己去提煉一些東西。

第一個可以提煉的是Common UI,比如對於有相似樣式的控制元件,可以提煉出共用的程式碼作為Common UI,達到元件複用的目的。處理完登入後要將模型共享出去,這時可以封裝一個AccountManager用來向伺服器換取模型,其他地方就能通過這個模型來獲取token或者使用者資訊。

在UI Kit上做繫結並不容易,需要用ReactiveCOcoa或者RxSwift這樣的框架來將View和ViewModel繫結或者模型反序列化等等。

今日頭條:iOS 架構設計雜談

經過這樣的設計整個App的層級結構已經初步成型,最底層是App功能,在此之上是App通用業務層,這塊提供可以相互使用的元件、模組。再往上的iOS通用層中其實很多東西在iOS的其他開發上都能夠用到。

公司通用

今日頭條:iOS 架構設計雜談

通常情況下一個公司會有幾個App,在App中的一些通用邏輯也可能可以給其他App使用。經過MVVM的設計ViewModel和Model已經與App的UI解耦,可以很輕鬆的將ViewModel往上提一個層次讓整個公司去使用,這時整個架構就會多出一個公司通用業務層。

整個過程中MVVM指導了UI與業務邏輯元件拆分,UI與業務邏輯的解耦使得不同APP間的登入功能有共用的元件,通過豐富的iOS通用層元件使繫結、網路請求、資料反序列化變得更容易實現。

架構設計需要產出的重要結果是三個通用層有豐富工具、模組,使大部分業務開發可以通過組合通用層的模組工具實現。

如何能設計好模組

設計好模組首先要了解設計原則,知道什麼情況下會帶來糟糕的依賴,並且要堅持這些原則。還要了解常用模組設計方法,比如對MVVM有比較深入的理解就能對GUI層的邏輯做很好的拆分。最後也是最重要的一點就是不斷反思改進,其實就是遇到坑的時候思考下為什麼怎麼坑。

架構在專案中執行

在一個專案中執行好的設計原則或者優秀的設計,首先需要建立合理的工程檔案結構,知道自己封裝好的元件應該放在哪裡。另外還要達成團隊架構設計共識,切勿悶頭開發。


相關文章