iOS 架構(gòu)模式

在構(gòu)建iOS應(yīng)用程序時(shí)虎囚,測試并不總是我們的主要工作。而當(dāng)我們在移動(dòng)開發(fā)中想要豐富測試經(jīng)驗(yàn)時(shí)赵讯,我們發(fā)現(xiàn)給iOS 應(yīng)用寫測試代碼有一定困難——即使我們遵循了Apple的指導(dǎo)原則并且實(shí)現(xiàn)了其 MVC模式巡揍。為了更好地測試我們必須想辦法用更好的方式去構(gòu)建我們的iOS應(yīng)用程序。那么個(gè)好的架構(gòu)應(yīng)該具備哪些特點(diǎn)呢油够?
1.各個(gè)實(shí)體分工明確蚁袭,任務(wù)量分配適中
2.可測試性(當(dāng)然做好第一點(diǎn),第二點(diǎn)往往就具備了)
3.易用性和低成本維護(hù)

既然我們定義了好的架構(gòu)模式的特點(diǎn)石咬,下面我們來一一回顧一下那些常用的架構(gòu)模式是否符合我們理想的iOS應(yīng)用程序構(gòu)建模式揩悄。

  • MVC模式:MVCModel-VIew-ControllerMVC模式致力于關(guān)注點(diǎn)的切分鬼悠,這意味著modelcontroller的邏輯是不與用戶界面(View)掛鉤的删性。Model層代表了描述業(yè)務(wù)邏輯和數(shù)據(jù)的一系列類的集合。它也定義了數(shù)據(jù)修改和操作的業(yè)務(wù)規(guī)則焕窝。View代表了UI組件蹬挺,像UIViewUIButton袜啃,UITableView等汗侵。他只負(fù)責(zé)展示從controller接收到的數(shù)據(jù)。因此群发,維護(hù)和測試程序變得更加簡單容易晰韵。然而在CocoaMVC模式中Controller經(jīng)常被混雜在View的生命周期中,因此很難說ViewViewController是分離的熟妓,這也往往驅(qū)使人們寫出臃腫的視圖控制器雪猪,盡管仍可以將業(yè)務(wù)邏輯和數(shù)據(jù)轉(zhuǎn)換到Model,但是大多數(shù)情況下當(dāng)需要為View減負(fù)的時(shí)候我們卻無能為力了起愈。View的最大的任務(wù)就是向Controller傳遞用戶動(dòng)作事件只恨。ViewController不再承擔(dān)一切代理和數(shù)據(jù)源的職責(zé)译仗,通常只負(fù)責(zé)一些分發(fā)和取消網(wǎng)絡(luò)請求以及一些其他的任務(wù)。當(dāng)在進(jìn)行單元測試的時(shí)候你會(huì)發(fā)現(xiàn)問題越來越明顯官觅。因?yàn)槟愕?code>ViewController和View是緊密耦合的纵菌,對它們進(jìn)行測試就顯得很艱難。Cocoa MVC看來并不是我們定義中理想的架構(gòu)模式休涤。

  • MVP模式:這個(gè)模式把Presenter換成Controller就和MVC非常相像了咱圆。這個(gè)設(shè)計(jì)模式把應(yīng)用程序分成了3個(gè)主要方面:ModelViewPresenter,其中的ModelView與MVC模中的角色相同功氨。Presenter負(fù)責(zé)處理View背后所有的UI事件序苏。它通過View接收用戶輸入,之后利用Model來處理用戶的數(shù)據(jù)捷凄,最后把結(jié)果返回給View忱详。與ViewController不同,ViewPresenter之間是完全解耦的跺涤,他們通過接口來交互匈睁。另外,presenter不像controller處理進(jìn)入的請求钦铁。這不是正解決了Cocoa MVCViewControllerView的耦合問題嗎软舌?就MVP模式而言,UIViewController的子類實(shí)際上就是Views并不是Presenters牛曹。這點(diǎn)區(qū)別使得這種模式的可測試性得到了極大的提高佛点,付出的代價(jià)是開發(fā)速度的一些降低,因?yàn)楸仨氁鲆恍┦謩?dòng)的數(shù)據(jù)和事件綁定黎比。但是這也意味著我們將最主要的任務(wù)劃分到PresenterModel超营,而View的功能較少——各個(gè)實(shí)體任務(wù)量分配不均衡。

  • MVVM模式:即Model-View-View Model阅虫。這個(gè)模式提供對ViewView Model的雙向數(shù)據(jù)綁定演闭。這使得View Model的狀態(tài)改變可以自動(dòng)傳遞給View。典型的情況是颓帝,View Model通過使用obsever模式(觀察者模式)來將View Model的變化通知給model米碰。View Model負(fù)責(zé)暴漏方法,命令购城,其他屬性來操作VIew的狀態(tài)吕座,組裝model作為View動(dòng)作的結(jié)果,并且觸發(fā)View自己的事件瘪板。它和MVP模式看起來非常像:MVVMViewController視作View,ViewModel之間沒有緊密的聯(lián)系吴趴。在使用MVVM模式時(shí),自然而然會(huì)想到ReactiveCoca侮攀,反之亦然锣枝。盡管通過簡單的綁定來使用MVVM是可實(shí)現(xiàn)的厢拭,但是ReactiveCocoa卻能更好的發(fā)揮MVVM模式的特點(diǎn)。但是使用這個(gè)框架有個(gè)難以忽略的事實(shí):當(dāng)你剛開始使用ReactiveCoca的時(shí)候有很大的可能就會(huì)把事情搞砸撇叁。換句話來說就是供鸠,如果發(fā)現(xiàn)了一些錯(cuò)誤,當(dāng)你試圖查看函數(shù)調(diào)用棧時(shí)你可能會(huì)喊:“天哪陨闹,好深的函數(shù)調(diào)用椈丶荆“!調(diào)試出這個(gè)bug可能會(huì)花費(fèi)大量的時(shí)間正林。MVVM很誘人,因?yàn)樗狭松鲜龇椒ǖ膬?yōu)點(diǎn)颤殴,并且由于在View層的綁定觅廓,它并不需要其他附加的代碼來更新View,盡管這樣涵但,可測試性依然很強(qiáng)——符合我們理想中好架構(gòu)模式的定義杈绸。

  • Viper架構(gòu)模式:由視圖 (View),交互器 (Interactor)矮瘟,展示器 (Presenter)瞳脓,實(shí)體 (Entity) 以及路由 (Routing) 組成。
    視圖:根據(jù)展示器的要求顯示界面澈侠,并將用戶輸入反饋給展示器劫侧。
    交互器:包含由用例指定的業(yè)務(wù)邏輯。
    展示器:包含為顯示(從交互器接受的內(nèi)容)做的準(zhǔn)備工作的相關(guān)視圖邏輯哨啃,并對用戶輸入進(jìn)行反饋(從交互器獲取新數(shù)據(jù))烧栋。
    實(shí)體:包含交互器要使用的基本模型對象。
    路由:包含用來描述屏幕顯示和顯示順序的導(dǎo)航邏輯拳球。
    Viper將應(yīng)用程序的邏輯結(jié)構(gòu)劃分為不同的責(zé)任層审姓。這使得它更容易隔離依賴項(xiàng) (如數(shù)據(jù)庫),也更容易測試各層間的邊界處的交互祝峻。
    Viper的不同層提供了明確的程序邏輯以及導(dǎo)航控制代碼來避免視圖控制器太過于臃腫的問題魔吐,利用 Viper ,視圖控制器可以簡潔高效莱找,意義明確地控制視圖酬姆。視圖控制器中代碼和所有的其他類很容易理解,容易測試宋距,理所當(dāng)然也更易維護(hù)轴踱。
    毫無疑問,Viper在劃分責(zé)任的粒度上比以上幾種模式都要優(yōu)秀谚赎,自然而然就有更好的可測試性淫僻,當(dāng)然你必須為很小功能的類寫出大量的接口诱篷。如果是在大型項(xiàng)目中使用Viper,Viper架構(gòu)模式符合我們理想中好架構(gòu)模式的定義雳灵。

從以上幾種架構(gòu)模式的分析中我們可以知道:沒有哪種架構(gòu)模式是絕對好的棕所,所以選擇架構(gòu)模式是一個(gè)根據(jù)實(shí)際情況具體分析利弊的過程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悯辙,一起剝皮案震驚了整個(gè)濱河市琳省,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躲撰,老刑警劉巖针贬,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拢蛋,居然都是意外死亡桦他,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門谆棱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來快压,“玉大人,你說我怎么就攤上這事垃瞧∧枇樱” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵个从,是天一觀的道長脉幢。 經(jīng)常有香客問我,道長信姓,這世上最難降的妖魔是什么鸵隧? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮意推,結(jié)果婚禮上豆瘫,老公的妹妹穿的比我還像新娘。我一直安慰自己菊值,他們只是感情好外驱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腻窒,像睡著了一般昵宇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儿子,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天瓦哎,我揣著相機(jī)與錄音,去河邊找鬼。 笑死蒋譬,一個(gè)胖子當(dāng)著我的面吹牛割岛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播犯助,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼癣漆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剂买?” 一聲冷哼從身側(cè)響起惠爽,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞬哼,沒想到半個(gè)月后婚肆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坐慰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年旬痹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讨越。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖永毅,靈堂內(nèi)的尸體忽然破棺而出把跨,到底是詐尸還是另有隱情,我是刑警寧澤沼死,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布着逐,位于F島的核電站,受9級(jí)特大地震影響意蛀,放射性物質(zhì)發(fā)生泄漏耸别。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一县钥、第九天 我趴在偏房一處隱蔽的房頂上張望秀姐。 院中可真熱鬧,春花似錦若贮、人聲如沸省有。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蠢沿。三九已至,卻和暖如春匾效,著一層夾襖步出監(jiān)牢的瞬間舷蟀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留野宜,地道東北人扫步。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像速缨,于是被迫代替她去往敵國和親锌妻。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容