MVVM par Karim PIerre Maalej

Post on 15-Jul-2015

3,285 views 1 download

Tags:

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

QA&

K

www.kypselia.com