Théorie: notion de modèle #
Le modèle contient les données d’une page #
-
Imaginons un
ModeleTexte
pour du texte structuré en paragraphes et en phrases -
En
Ntro
, il s’agit d’une classe Java qui implanteModel
public 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
String
ouint
-
Pour notre exemple
ModeleTexte
, imaginons deux valeurs:Paragraphe
Phrase
-
En
Ntro
, une valeur est une classe Java qui implanteValue
public 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
ModeleTexte
peut maintenant mémoriser une liste de paragraphespublic class ModeleTexte implements Model { private String texteBrut; private List<Paragraphe> paragraphes = new ArrayList<>(); }
-
Chaque
Paragraphe
peut 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
ModeleTexte
dé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
Paragraphe
dé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
Phrase
est 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
\n
et des indentations\t
<p> Phrase a1. Phrase a2. Phrase a3. </p> <p> Phrase b1. Phrase b2. </p>