SlideShare a Scribd company logo
1 of 59
Download to read offline
MVC⇢MVVM⇢MVVMC
開發經驗分享
iPlayground 2019

@nghuiqin
⾃肥時間
• NG(⾺來⻄亞⼈)
• Develop from iOS 6, 7
• 在台灣⼯作快滿5年
前⾔
我沒有要說MVC的壞話

MVC其實是很多巨頭APP的根基
簡介
• MVC介紹 → 常犯的問題 → 如何避免和維護
• MVVM解決什麼 → 實戰⼼得 → 優化
• MVVMC再進化 → 實戰⼼得 → 要注意的坑
Model
View
Controller
MVC
MVC常遇到的問題
Controller 背負的責任
Fetch models
Views layout
Business Logic
Routing Logic
Selectors
(Handle actions)
Miscellaneous
(Location, Map, Event…)
Delegates
如何
減輕Controller的負擔
有些職責Model該做
Fat Model Skinny Controller
模組化設計
→ reusability
Utilities
APIManager
IAPHelper
LocationManager
AccountManager
Reachability
iCloudManager
Singletons
Extension (Category)
程式的品質
Code Quality
UNIT TEST
View
Controller
View
Business Logic
Account State
MVC 寫測試遇到瓶頸
Controller 會帶⼀些我們
不需要的Code
Business Logic 有可能被
其他View/Object影響
…
Model
View
Controller
MVC MVVM
Model
ViewModel
View

(Controller)
Controller 背負的責任
Fetch models
Views layout
Business Logic
Routing Logic
Selectors
(Handle actions)
Miscellaneous
(Location, Map, Event…)
Delegates
MVVM - Controller ⼯作量
initViewModel
Views layout
Routing Logic
Selectors
(Handle actions)
Delegates
MVVM
Model
ViewModel
View

(Controller)
我很單純
ViewModel
Binding to
View
→
→
→
→
Unit Test
Controller
Business Logic
Account State
ViewModel
View
…
就有理由不⽤寫
Controller的單元測試
MVVM 實戰經驗談
我遇過的問題
是不是所有View都需要
ViewModel?
不需要

簡單的畫⾯可以省略
畫⾯複雜ViewModel好肥
StreamRoomViewModel 不負責任的假設

如果你的畫⾯跟17 App⼀樣很炫炮
MessageBox
ViewModel
GiftPanel
ViewModel
RankingViewModel
AnimationViewModel
沒有⼈⽣來就可以寫完美的code,
持續 refactor 吧 GO!
設計上比MVC花更多時間
某種程度上強迫你去理解完整的商業邏輯

先別動⼿寫Code,先思考。

畫好你的框架再填入內容
ViewModel 處理的資料/狀態
變多的時候...
我還是讀得朦傻傻
ViewModel 優化
更好讀、測試更好寫
順便釐清責任
Inputs/Outputs Protocol
始於Kickstarter在Java&Swift設計的⼀個VM structure

https://github.com/kickstarter/native-docs/blob/master/vm-structure.md
實作ViewModel
⽤Input約束其他物件的控制
⽤Output約束出⼝,只做readOnly
Binding的時候也好讀
寫Unit Test的時候也簡單
Model
View
Controller
MVC MVVM
Model
ViewModel
View

(Controller)
MVVMC
Model
ViewModel
View

(Controller)
Coordinator
MVVMC 變形有很多種
我個⼈使⽤的是Green⼤⼤寫的Coordinator (比較單純,沒太多元素)

https://github.com/nghuiqin/Todo-RxSwift-MVVMC/tree/master/Library
MVVM - Controller 責任
initViewModel
Views layout
Routing Logic
Selectors
(Handle actions)
Delegates
Controller 責任-1
initViewModel
Views layout
Selectors
(Handle actions)
Delegates
Routing logic
Coordinator
initVC
Controller
增加可重複使⽤性
Controller 責任-1
initViewModel
Views layout
Selectors
(Handle actions)
Delegates
Routing logic
Coordinator
initVC
視情況⽽定
App
Coordinator
Login
Coordinator
MainTab
Coordinator
Register
Coordinator
Home
Coordinator
Setting
Coordinator
Detail
Coordinator
Dependency Injection
消滅Singleton的存在
Singleton 的隱患
關聯性問題 Coupling Issue
→ 到底是誰改了它的值?

→ 想像⼀下Global Variable的可怕,海底撈針

→ 寫測試的時候,它的狀態要怎麼控制?(難)
定義App Dependency
靠Coordinator指派下去
在ViewModel/View裡

設計Dependency的取⽤
DI + Protocol 簡化
單元測試
現在我可以⾃由決定這個ViewModel的狀態
⽬標就是測試ViewModel + Dependency邏輯正確
建議DateFormatter也可以當
Utilities Dependency
蘋果在這裏告訴你DateFormatter很貴

https://developer.apple.com/library/archive/documentation/Cocoa/
Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html
寫MVVMC可能
會遇到的坑
不建議使⽤xib/Storyboard
為了讓Dependency inject起來漂亮
Coordinator 注意回收的問題
依你使⽤的Coordinator的設計⽽定

我的情況是在原⽣回到上⼀⾴時下需要特別處理

另外就是可能被ViewController/ViewModel retain
AppDependency傳入的⽅法
由於Coordinator是有層層關係

App → B → C → D

如果只有D需要dependency的東⻄

B、C的Coordinator也會需要帶
MVVMC學習成本頗⾼
真諦是理解為什麼要這樣設計
好像離⼤神更進⼀⼩步了
以後⾯試拿出來說嘴 (X
• 選擇適合你團隊的架構

• 沒接觸過MVVM的話,可先從MVVM開始

• 有必要跟風MVVMC嗎? 看團隊意願

• 個⼈建議全新專案 + 團隊認可這個⽅案

• ⼀⼈團隊沒有太多時間QAQ: MVC其實也不賴啦
結語
“Keep it simple, stupid.”
先從簡單的開始
References
Follow Green

• Github: @Greenchiu , Twitter: @handkid

Kickstarter Inputs/Outputs Protocol

• https://github.com/kickstarter/native-docs/blob/master/
vm-structure.md

想要了解更多MVVMC實作,可以參考我的練習

• https://github.com/nghuiqin/Todo-RxSwift-MVVMC/

More Related Content

Similar to MVC MVVM MVVMC

twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC
 
Asp.net mvc 基礎
Asp.net mvc 基礎Asp.net mvc 基礎
Asp.net mvc 基礎Gelis Wu
 
Angular.js & ASP.NET in Study4
Angular.js & ASP.NET in Study4Angular.js & ASP.NET in Study4
Angular.js & ASP.NET in Study4Kyle Shen
 
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊twMVC
 
Single-Page Application Design Principles 101
Single-Page Application Design Principles 101Single-Page Application Design Principles 101
Single-Page Application Design Principles 101Jollen Chen
 
Asp.Net MVC 一教就上手
Asp.Net MVC 一教就上手Asp.Net MVC 一教就上手
Asp.Net MVC 一教就上手Study4TW
 
ASP.NET MVC 快速上手
ASP.NET MVC 快速上手ASP.NET MVC 快速上手
ASP.NET MVC 快速上手Study4TW
 
Non-MVC Web Framework
Non-MVC Web FrameworkNon-MVC Web Framework
Non-MVC Web FrameworkFred Chien
 
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練42016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4Duran Hsieh
 
极速 Angular 开发:效能调校技巧 (ngChina 2019)
极速 Angular 开发:效能调校技巧 (ngChina 2019)极速 Angular 开发:效能调校技巧 (ngChina 2019)
极速 Angular 开发:效能调校技巧 (ngChina 2019)Will Huang
 
MobileWebAppFramework_V5_design
MobileWebAppFramework_V5_designMobileWebAppFramework_V5_design
MobileWebAppFramework_V5_designJackson Tian
 
AngularJS 開發 ASP.NET MVC -twMVC#9
AngularJS 開發 ASP.NET MVC -twMVC#9AngularJS 開發 ASP.NET MVC -twMVC#9
AngularJS 開發 ASP.NET MVC -twMVC#9twMVC
 
twMVC#09 | AngularJS 開發 ASP.NET MVC
twMVC#09 | AngularJS 開發 ASP.NET MVCtwMVC#09 | AngularJS 開發 ASP.NET MVC
twMVC#09 | AngularJS 開發 ASP.NET MVCtwMVC
 
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)twMVC
 
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4twMVC
 
KSDG-ASP.NET MVC 5 Overview (偽三國誌)
KSDG-ASP.NET MVC 5 Overview (偽三國誌)KSDG-ASP.NET MVC 5 Overview (偽三國誌)
KSDG-ASP.NET MVC 5 Overview (偽三國誌)Bruce Chen
 
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit TestingASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing江華 奚
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2twMVC
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC
 

Similar to MVC MVVM MVVMC (20)

twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸
 
Asp.net mvc 基礎
Asp.net mvc 基礎Asp.net mvc 基礎
Asp.net mvc 基礎
 
Mvc
MvcMvc
Mvc
 
Angular.js & ASP.NET in Study4
Angular.js & ASP.NET in Study4Angular.js & ASP.NET in Study4
Angular.js & ASP.NET in Study4
 
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
 
Single-Page Application Design Principles 101
Single-Page Application Design Principles 101Single-Page Application Design Principles 101
Single-Page Application Design Principles 101
 
Asp.Net MVC 一教就上手
Asp.Net MVC 一教就上手Asp.Net MVC 一教就上手
Asp.Net MVC 一教就上手
 
ASP.NET MVC 快速上手
ASP.NET MVC 快速上手ASP.NET MVC 快速上手
ASP.NET MVC 快速上手
 
Non-MVC Web Framework
Non-MVC Web FrameworkNon-MVC Web Framework
Non-MVC Web Framework
 
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練42016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
 
极速 Angular 开发:效能调校技巧 (ngChina 2019)
极速 Angular 开发:效能调校技巧 (ngChina 2019)极速 Angular 开发:效能调校技巧 (ngChina 2019)
极速 Angular 开发:效能调校技巧 (ngChina 2019)
 
MobileWebAppFramework_V5_design
MobileWebAppFramework_V5_designMobileWebAppFramework_V5_design
MobileWebAppFramework_V5_design
 
AngularJS 開發 ASP.NET MVC -twMVC#9
AngularJS 開發 ASP.NET MVC -twMVC#9AngularJS 開發 ASP.NET MVC -twMVC#9
AngularJS 開發 ASP.NET MVC -twMVC#9
 
twMVC#09 | AngularJS 開發 ASP.NET MVC
twMVC#09 | AngularJS 開發 ASP.NET MVCtwMVC#09 | AngularJS 開發 ASP.NET MVC
twMVC#09 | AngularJS 開發 ASP.NET MVC
 
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
 
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
 
KSDG-ASP.NET MVC 5 Overview (偽三國誌)
KSDG-ASP.NET MVC 5 Overview (偽三國誌)KSDG-ASP.NET MVC 5 Overview (偽三國誌)
KSDG-ASP.NET MVC 5 Overview (偽三國誌)
 
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit TestingASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有
 

MVC MVVM MVVMC