mvvm par karim pierre maalej
Post on 15-Jul-2015
3.286 Views
Preview:
TRANSCRIPT
MVVM
K
www.kypselia.com
[CocoaHeads.fr]
par Karim-Pierre Maalej
Paris ∙ 12 mars 2015
MVC
MVC?
massiveview 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 UIViewControllerNSViewController
UIViewNSView
Principes
Model ViewModel ViewViewControllerdevice-specific
screen-specific
intention
sémantique de présentation UI logic and state
décoration
Testable !
Model ViewModel Unit Testdevice-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
top related