Just a Computer Graphics Studio & My Life

MVC與MVP

已經寫超過三年半的iOS App,一直以為自己對MVC很熟,但其實不然,畢竟我一直不是用正規的MVC來實作,相信大多數的iOS App開發者也有類似的煩惱XD~

不過沒有寫得很標準,其實不會怎樣,大不了專案難以維護,接手你程式的工程師想要翻桌,這是每位稱職工程師的必經之路!於是我們會學習會成長,然後寫出更好的架構來。

最近技術委員會決議要統一iOS和Android的專案程式架構,由我們最資深的工程師楊大決定從MAC進展到MVP

MVC與MVP.gif

有了這張對照圖,就能很清楚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 Original

一開始的MVC,三個角色其實互有關係。

MVC – Apple定義

MVC Apple

Apple官方定義View和Model只能透過Controller來發生關係!

MVC – 實際開發

MVC Reality

看我們開發的專案就可以知道,我們的UIViewController一直都和UIView形影不離呢!因此controller中的程式碼破千行不是難事XD~這跟Apple定義的MVC不相符,但卻是最多開發者寫出來的架構!就是因為我們懶惰的天性把它寫肥⋯⋯

MVP

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的精神囉:)~

參考:

廣告

發表留言

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

標籤雲

%d 位部落客按了讚: