已經寫超過三年半的iOS App,一直以為自己對MVC很熟,但其實不然,畢竟我一直不是用正規的MVC來實作,相信大多數的iOS App開發者也有類似的煩惱XD~
不過沒有寫得很標準,其實不會怎樣,大不了專案難以維護,接手你程式的工程師想要翻桌,這是每位稱職工程師的必經之路!於是我們會學習會成長,然後寫出更好的架構來。
最近技術委員會決議要統一iOS和Android的專案程式架構,由我們最資深的工程師楊大決定從MVC進展到MVP。
有了這張對照圖,就能很清楚MVC與MVP的差別!最關鍵的地方就在View和Model不互通有無的三角戀情。
這幾天研究對岸高人(台灣人隱藏實力)的文章論述,收穫肯定是良多!那麼我就先講結論,這些高人覺得哪一種架構最高明,能夠萬夫莫敵?這時候要像庫拉皮卡一行人在山腳下保持沈默,對~這就是答案。
從來沒有一個架構能完美套用到任何專案,我們要學習的是清楚分析專案的需求,來決定所要用的架構來程式設計。也就是說,先看我們的目的,再來選擇手段。想起有位網友什麼程式語言都想學,我就建議他先看你想要做什麼吧!可以參考文章:圖解我該學什麼程式語言?
任誰都可以發明一種架構,比如我想發明KISS (Keep It Simple and Stupid),也無不可XD~
回到正題,發明MVC與MVP其實真有它的道理,若非案子時程相當緊湊,而且上架後再也不維護,不然專案一定要有嚴謹的架構可以遵循,否則時間成本肯定上揚。
看到某篇大神的文章說到目前iOS風行的架構是MVVM;而Android追從的架構是MVP,難怪楊大要選擇MVP為統一的標準,因為他是寫Android的工程師XD~據我目前學習所知,MVVM和MVP最大的差異在於前者有資料綁定,讓View和Model有機會溝通,也因此讓架構再次耦合⋯⋯近年來如火如荼發展的ReactiveCocoa,就是以MVVM發展出來的開源,有時間一定要嘗試一下。
在這裡我就先不介紹MVVM,因為我們已經決定以MVP來發展專案。
MVC在web時代已存在,如今跨越到app時代,想必定義有所進化⋯⋯其實是各說各話XD~
MVC – 原始模樣
一開始的MVC,三個角色其實互有關係。
MVC – Apple定義
Apple官方定義View和Model只能透過Controller來發生關係!
MVC – 實際開發
看我們開發的專案就可以知道,我們的UIViewController一直都和UIView形影不離呢!因此controller中的程式碼破千行不是難事XD~這跟Apple定義的MVC不相符,但卻是最多開發者寫出來的架構!就是因為我們懶惰的天性把它寫肥⋯⋯
MVP
咦?這跟Apple官方定義的MVC好像耶⋯⋯彷彿只是將Controller替換為Presenter,重新包裝後感覺新穎哪~
我實際在新專案實現MVP,發現Presenter可以不管View和Model的細節,只要input給兩者然後等待兩者的output,此時Presenter就瘦身成功囉!儘管我會多花時間定義和實作View的.h和.m檔,對未來維護專案可是相當有助益,習慣這種寫法之後就能越寫越快。
看一下高手怎麼定義:
MVP:是MVC的變種,其中Model和View的定義與MVC的一致,不同點在於:MVC的Controller是管理一組Model與View之間交互邏輯,是一個管理者;而Presenter(展示者)則是Model於View之間的連接者,針對特定模塊的View提供對應的格式化的Model數據,將View中的行為反饋到Model中。所以MVC中的Controller一般會管理一個或多個Model和一個或多個View,而Presenter則是MPV一對一,有更細的粒度和更好的解耦。
M應該做的事:
- 給ViewController取得資料提供接口
- 給ViewController存儲資料提供接口
- 提供經過抽象化的業務基本組件,供Controller調用
P應該做的事:
- 管理View Container的生命週期
- 負責生成所有的View實體,並放入View Container
- 監聽來自View與業務有關的事件,透過與Model的合作,來完成對應事件的業務
V應該做的事:
- 響應使用者事件
- 執行動畫效果
- 表達界面元素
我想只要實作過幾次,就能逐漸心領神會MVP的精神囉:)~
參考:
Comments on: "MVC與MVP" (3)
現在想應徵資深 iOS 工程師,很多都要求 MVC 和 MVVM 經驗呢~😎
讚讚
[…] 回想我還在健康科技公司時,是如此呼風喚雨,iOS App由我一個人獨自從無打造出來,後進來的Android工程師都要仿照我的方式來實現,畢竟小而美的創業公司資源不多,要盡可能使用最少資源來達成目標。對比現在港商的工作狀況,產品已經由資深同事開發10個月,架構是由他建立起來的「樂高系統」,MVC架構非常分明,就好比我當初使用MVP架構寫HiLife App,然而相對的所花費的時間變多。 […]
讚讚
[…] 我們家的產品屬於UCG平台,它是類似臉書的社交平台,目前已開發將近一年,總算要完成上架囉!話說我在香港的iOS同事,做了個「樂高系統」,給我的感覺真的很像上圖的俄羅斯方塊!任何功能和流程都要遵守MVC架構或MVP架構,儘管看似開發速度不快,卻能讓未來增修功能流程時,能夠非常清楚明瞭每一部份的脈絡。 […]
讚讚