mvvm par karim pierre maalej
TRANSCRIPT
![Page 1: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/1.jpg)
MVVM
K
www.kypselia.com
[CocoaHeads.fr]
par Karim-Pierre Maalej
Paris ∙ 12 mars 2015
![Page 2: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/2.jpg)
MVC
![Page 3: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/3.jpg)
MVC?
massiveview controller
![Page 4: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/4.jpg)
MVC : une bonne idée, à la base…
Model
Controller
View
![Page 5: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/5.jpg)
En réalité…
Model
Controller
View@interface@property@property@property@end!@implementation@end
![Page 6: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/6.jpg)
Et ça pose des problèmes
• Classes trop lourdes, trop complexes
• Code peu testable
• Difficile à maintenir
• Difficile de travailler à plusieurs
![Page 7: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/7.jpg)
Le Contrôleur en fait trop !
![Page 8: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/8.jpg)
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 »
![Page 9: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/9.jpg)
Modèle de Vue
Model ViewModel View
![Page 10: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/10.jpg)
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
![Page 11: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/11.jpg)
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
![Page 12: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/12.jpg)
Principes
Model ViewModel ViewViewControllerdevice-specific
screen-specific
intention
sémantique de présentation UI logic and state
décoration
![Page 13: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/13.jpg)
Testable !
Model ViewModel Unit Testdevice-specific
screen-specific
![Page 14: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/14.jpg)
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)
![Page 15: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/15.jpg)
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
![Page 16: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/16.jpg)
Bindings
Model ViewModel ViewViewController
![Page 17: MVVM par Karim PIerre Maalej](https://reader031.vdocument.in/reader031/viewer/2022031823/55a6863f1a28abe7088b4677/html5/thumbnails/17.jpg)
Bindings
Model ViewModel ViewViewController
delegate delegate
KVO KVO
ReactiveCocoa ReactiveCocoa
ou ou
ouou