Théorie: notion de modèle #
Le modèle contient les données d’une page #
-
Imaginons un
ModeleTextepour du texte structuré en paragraphes et en phrases -
En
Ntro, il s’agit d’une classe Java qui implanteModelpublic class ModeleTexte implements Model { -
On doit déclarer chaque modèle dans le client:
public class AppPong implements NtroAppFx { // ... @Override public void registerModels(ModelRegistrar registrar) { registrar.registerModel(ModeleTexte.class); } -
Les attributs de la classe déterminent les données à mémoriser dans le modèle
public class ModeleTexte implements Model { private String texteBrut; }
Le modèle contient des valeurs #
-
Une Valeur est un objet qui n’est pas une valeur de base comme
Stringouint -
Pour notre exemple
ModeleTexte, imaginons deux valeurs:ParagraphePhrase
-
En
Ntro, une valeur est une classe Java qui implanteValuepublic class Paragraphe implements ModelValue { private String paragrapheBrut; }public class Phrase implements ModelValue { private String phraseBrute; } -
On doit déclarer chaque valeur dans le client
public class AppPong implements NtroAppFx { // ... @Override public void registerModels(ModelRegistrar registrar) { // ... registrar.registerValue(Paragraphe.class); registrar.registerValue(Phrase.class); } -
Le
ModeleTextepeut maintenant mémoriser une liste de paragraphespublic class ModeleTexte implements Model { private String texteBrut; private List<Paragraphe> paragraphes = new ArrayList<>(); } -
Chaque
Paragraphepeut mémoriser une liste de phrasespublic class Paragraphe implements ModelValue { private String paragrapheBrut; private List<Phrase> phrases = new ArrayList<>(); }
Le modèle est formé d’un ou plusieurs objets #
-
Typiquement, un modèle contient plusieurs objets
- un objet principal (le modèle comme tel)
- des objets secondaires, qui représentent des valeurs contenu dans le modèle
Le modèle est indépendant de la logique du programme #
-
Le modèle ne décide pas:
- quand il est créé
- où il est sauvegardé (fichier ou DB)
- sur quelle vue il est affiché
- après quel événement usager il doit être modifié
-
Les tâches ci-haut appartiennent au dorsal ou au frontal
- (ou au Contrôleur du patron MVC)
Le modèle implante la logique du domaine #
-
Le modèle décide:
- quelles données mémoriser et afficher (mais pas comment les afficher)
- comment modifier ces données
-
La logique du domaine est spécifique au type de données qu’on représente, p.ex.
- jeu d’échecs
- comment bouger les pièces
- logiciel d’impôts
- comment calculer le total des revenus imposables
- traitement de texte
- où appliquer les alinéas (indentation au début d’un paragraphe)
- jeu d’échecs
-
Dans notre exemple, on peut imaginer une méthode
genererHtml
Truc: déléguer aux valeurs #
-
La division du modèle en valeurs facilite l’implantation de
genererHtml- le
ModeleTextedélègue la génération de chaque paragraphe
public class ModeleTexte implements Model { // ... public String genererHtml() { String html = ""; for(Paragraphe paragraphe : paragraphes) { html += paragraphe.genererHtml(); } return html; } }- le
Paragraphedélègue la génération de chaque phrase
public class Paragraphe implements ModelValue { // ... public String genererHtml() { String html = "<p>"; for(Phrase phrase : phrases) { html += phrase.genererHtml(); } html += "</p>"; return html; } }- la
Phraseest simple à générer
public class Phrase implements ModelValue { // ... public String genererHtml() { return phraseBrute + ". "; } } - le
-
Voici le résultat
<p>Phrase a1. Phrase a2. Phrase a3. </p><p>Phrase b1. Phrase b2. </p> -
On peut aussi ajouter des retours de ligne
\net des indentations\t<p> Phrase a1. Phrase a2. Phrase a3. </p> <p> Phrase b1. Phrase b2. </p>