Tutoriel 4: analyse #
Comparer le comportement de dep03 et dep04
#
|
|
|
|---|---|
|
|
|
|
|
|
|
Comparer les graphes de tâches de dep03 et dep04
#
|
|
|
|---|---|
|
|
|
|
Comparer les fichiers dep03 et dep04
#
- Comparer les répertoires
dep03/srcetdep04/srcavec VSCode:
Nouveaux fichiers dans dep04
#
|
|
Fichiers différents #
|
|
Exemple d’analyse d’un nouveau fichier: ModeleA
#
Voici le ModeleA
public class ModeleA implements Model, WatchJson, WriteObjectGraph {
private boolean attrA = false;
private double attrB = 10.0;
private List<ValeurA> valeurs = new ArrayList<>();
public void methodeC(VueA vueA) {
vueA.methodeA(this.toString());
}
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("attrA: " + attrA);
builder.append(System.lineSeparator());
builder.append("attrB: " + attrB);
builder.append(System.lineSeparator());
builder.append(System.lineSeparator());
builder.append("valeurs: ");
builder.append(System.lineSeparator());
for(ValeurA valeur : valeurs) {
builder.append(" ");
builder.append(valeur.toString());
builder.append(System.lineSeparator());
}
return builder.toString();
}
}
Attributs ModeleA
#
- on a
attrAetattrB - on a une liste où chaque item est un objet de type
ValeurA
À quoi sert methodeC?
#
-
La méthode reçoit en paramètre une référence à la
VueA, convertit l’objet courant en chaîne, puis appelleVueA.methodeApublic class ModeleA implements Model, WatchJson, WriteObjectGraph { //... public void methodeC(VueA vueA) { vueA.methodeA(this.toString()); } -
À quoi sert la
methodeA? -
En VSCode, placer le curseur sur
methodeAet faire F12 (Atteindre la définition)- autre option: Ctrl+Clic sur
methodeA
- autre option: Ctrl+Clic sur
-
La
VueA.methodeAest comme suit:public class VueA extends ViewFx { @FXML private Label labelA; // ... public void methodeA(String paramA) { labelA.setText(paramA); } }-
affiche du texte dans un Label
-
renommages possible pour
VueA.methodeA:afficherafficherTexteafficherEnBas(de la page)
-
-
En VSCode, revenir à
ModeleA: où est appelé lamethodeC? -
En VSCode, placer le curseur sur
methodeCet faire Alt+Maj+H- autre option: Clic-droit => Afficher la hiérarchie des appels
-
On sait maintenant que
methodeCest appelée dans latacheD1
-
La
tacheD1devrait s’exécuter à chaque fois que le modèle est modifié- à cause du
waitsFor(modified(ModeleA))
- à cause du
-
Vérifier en observant la console:
-
Donc la
tacheD1etModeleA.methodeCservent à afficher le modèle en mode texte sur laVueAdès que le modèle est modifié -
Renommages possibles pour
methodeCafficherafficherSurafficherEnModeTexteafficherEnModeTexteSur
Qu’est-ce que ValeurA?
#
En VSCode, placer le curseur sur ValeurA et faire F12 (Atteindre la définition)
- autre option: Ctrl+Clic sur
ValeurA
VSCode va ouvrir ValeurA:
public class ValeurA implements ModelValue {
private String attrA;
private int attrB;
@Override
public String toString() {
return "[" + attrA + ", " + String.format("%02d", attrB) + "]";
}
}
-
on a
attrAetattrB -
on peut s’attendre à des données du genre:
{ "_C": "ValeurA", "attrB": 8, "attrA": "str06" }ou encore:
{ "_C": "ValeurA", "attrB": 19, "attrA": "str05" }ou encore:
{ "_C": "ValeurA", "attrB": 4, "attrA": "str03" } -
la méthode
toStringretourne une chaîne avec la valeur des deux attributs:
| Données |
retour de |
|---|---|
|
|
|
|
|
|
Exemple d’analyse d’un fichier modifié: VueA
#
Ajouts à la VueA
-
ajout d’attributs
@FXMLpour récupérer les contrôleslabelAboutonA
-
ajout de validation qu’on a bien récupéré le contrôle, p.ex.
Ntro.assertNotNull(labelA)
-
déclenché un événement Ntro quand le
boutonAest appuyé:boutonA.setOnAction(evtFx -> { Ntro.newEvent(EvtB.class).trigger(); }); -
où est-ce que l’événement
EvtBest capté? -
En VSCode, placer le curseur sur
EvtBet faire Maj+F12- autre option: clic-droit => Atteindre les références
-
On voit que
EvtBapparaît dans une desTachesCqui fait unwaitsFor(EvtB)
-
Cliquer sur le
waitsFor(EvtB)pour afficher directement la bonne tâche,tacheC2:private static void tacheC2(FrontendTasks subTasks) { subTasks.task("tacheC2") .waitsFor(event(EvtB.class)) .waitsFor(created(VueRacine.class)) .waitsFor(created(VueB.class)) .executes(inputs -> { var objD = inputs.get(event(EvtB.class)); var objE = inputs.get(created(VueRacine.class)); var objF = inputs.get(created(VueB.class)); objD.methodeA(objE, objF); }); } -
C’est la tâche qui réagit à l’
EvtBet afficher laVueB -
Renommages possibles:
EvtB=>EvtAfficherVueB
-
Vérifier en observant la console