MVVM
K
www.kypselia.com
[CocoaHeads.fr]
par Karim-Pierre Maalej
Paris ∙ 12 mars 2015
MVC
MVC?
massive
view controller
MVC : une bonne idée,
à la base…
Model
Controller
View
En réalité…
Model
Controller
View
@interface	
@property	
@property	
@property	
@end	
!
@implementation	
@end
Et ça pose des problèmes
• Classes trop lourdes, trop complexes
• Code peu testable
• Difficile à maintenir
• Difficile de travailler à plusieurs
Le Contrôleur en fait trop !
Le Contrôleur en fait trop
• Il devrait se limiter à ce que son nom suggère :
contrôler la Vue
• Le reste doit être placé ailleurs
• la logique métier doit retourner dans le Modèle
• la préparation des données à afficher doit avoir lieu
dans une autre classe : le « Modèle de Vue »
Modèle de Vue
Model ViewModel View
Points forts
• Compatible avec MVC
• (ouf)
• Isolation entre les 3 couches
• le code est davantage réutilisable
• les tests unitaires sont plus fiables
• Code plus propre, plus clair
• Excelle avec un mécanisme de binding
Principes
• Le Modèle se concentre sur le métier, et ne connaît
personne d’autre
• Le Modèle de Vue connaît seulement le Modèle, il règle
ses propriétés et les écoute
• Le Contrôleur fait simplement le lien entre le Modèle de
Vue et la Vue, il ne connaît pas le Modèle
Model ViewModel ViewViewController
NSObject NSObject UIViewController	
NSViewController
UIView	
NSView
Principes
Model ViewModel ViewViewController
device-specific
screen-specific
intention
sémantique de présentation
UI logic and state
décoration
Testable !
Model ViewModel Unit Test
device-specific
screen-specific
Exemple
Person
- firstName:
- lastName:
- gender:
- birthDate:
PersonViewController
- nameLabel:
- ageLabel:
nameLabel.text = person.gender ? “M. ”:“Mme ” + person.firstName + “ ” + person.lastName
ageLabel.text = NSDate.date().yearsFrom(person.birthDate)
Exemple
Person
- firstName:
- lastName:
- gender:
- birthDate:
PersonViewModel
- nameString: String

- ageString: String
PersonViewController
- nameLabel:
- ageLabel:
nameString = person.gender ? “M. ”:“Mme ” + person.firstName + “ ” + person.lastName
ageString = NSDate.date().yearsFrom(person.birthDate)
nameLabel.text = viewModel.nameString
ageLabel.text = viewModel.ageString
Bindings
Model ViewModel ViewViewController
Bindings
Model ViewModel ViewViewController
delegate delegate
KVO KVO
ReactiveCocoa ReactiveCocoa
ou ou
ouou
QA&
K
www.kypselia.com

MVVM par Karim PIerre Maalej