ntro.ca

        • Contrats de classe
        • Liens utiles
        • Calendrier
        • Calendrier groupe 2
        • Calendrier groupes 1, 3
        • Structure du cours
        • Évaluations
        • Matériel à se procurer
        • Les profs
          • Marc-Olivier Tremblay
          • Mathieu Bergeron
        • Module 1.1: installation + trier des cartes
        • Module 1.2: rappels POO
        • Module 1.3: tableau d'objets
        • Examen 1
        • Module 2.1: données JSON
        • Module 2.2: données en Java
        • Module 2.3: récursivité
        • Examen 2
        • Module 3.1: structure générique
        • Module 3.2: efficacité (1)
        • Module 3.3: efficacité (2)
        • Examen 3
        • Module 4.1: liste naïve
        • Module 4.2: liste par tableau
        • Module 4.3: liste chaînée
        • Examen 4
        • Module 5.1: mappage naïf
        • Module 5.2: mappage par hachage
        • Module 5.3: mappage par arbre
        • Examen 5
        • Équipes
          • Horaire groupe 1
          • Horaire groupe 2
          • Horaire groupe 3
          • Groupe 1
          • Groupe 2
          • Groupe 3
        • Projets vedettes 2022
        • Projets vedettes 2023
        • Projets vedettes 2024
        • Survol
        • Structure
        • Calendrier
        • Calendrier des séances
        • Évaluations
        • Exemples de jeu
        • Exemples de pages
        • Réponses à vos questions
        • Module 1: créer le projet
        • Module 2: concevoir l'application
        • Module 3: vues NtroFx
        • Module 4: modèle et navigation
        • Module 5: ajouter le dorsal, modifier le modèle
        • Module 7: améliorer l'affichage
        • Module 8: jeu en 2d
        • Module 9: client/serveur
        • Module 10: plusieurs instances du même modèle
        • TP1
        • Examen 1
        • TP2
        • Examen 2
        • Projet de fin de session
      • Ajout Format JSON
        • Calendrier
        • Évaluations
        • Structure du cours
        • Contrat de classe
        • Le prof
        • 01: Windows et Word
          • Astuces et raccourcis
        • 02: Word
        • 03: Word
          • Exercice Word: insertion d'éléments spéciaux
          • Exercice Word: tableaux
        • 04: Word
          • Exercice Word: références
          • TP01: Word (15%)
        • 05: PowerPoint
          • TP02: PowerPoint (10%)
        • 06: Examen Word (20%)
        • 07: Excel
        • 08: Excel
        • 09: Excel
          • TP03: Excel (15%)
        • 10: Excel
        • 11: Examen Excel (20%)
        • 12: Access
        • 13: Access
        • 14: Access
        • 15: Examen Access
      • Sondage H2023 (dept. info)
      • Vision H2023 (dept. info)
      • P1) exercices interactifs de lecture
      • P2) transition Excel vers Python
        • Atelier 2: un exemple
      • Index
      • Point de vue sur l'IA
    Théorie: singleton Vs collection
    • Théorie: singleton Vs collection
      • Singleton
      • Collection
      • Observer une instance en particulier
      • Modifier une instance en particulier
      • Les tâches et le reste du code ne change pas

    Théorie: singleton Vs collection #

    Singleton #

    • Jusqu’à maintenant on a travaillé avec une seule instance de chaque modèle

      • (singleton veut dire «une seule instance»)
      └── models
          ├── ModeleFileAttente.json
          └── ModelePartie.json
      

    Collection #

    • Souvent, un modèle correspond plutôt à une collection d’instances

    • Par exemple, on peut avoir une file d’attente pour chacune des régions ci-bas

    • On a alors plusieurs version du modèle, chacune identifée par un id de région unique

      public enum Region {
      
              AFRIQUE, ASIE, AMERIQUE, EUROPE;
      
          }
      
    • Dans le tutoriel 10, on transforme ModeleFileAttente en Collection:

      └── models
          ├── ModeleFileAttente
              ├── AFRIQUE.json
              ├── AMERIQUE.json
              ├── ASIE.json
              └── EUROPE.json
          └── ModelePartie
      
      • NOTES:
        • ModeleFileAttente est maintenant un répertoire (une collection)
        • chaque fichier JSON du répertoire est une instance du modèle

    Observer une instance en particulier #

    • Pour observer l’instance AMEMRIQUE, faire p.ex.

      SessionPong session = Ntro.session();
      
          session.setModelSelection(ModeleFileAttente.class, "AMERIQUE");
      
    • De façon plus générale, dans une méthode

      public class SessionPong extends Session<SessionPong> {
      
              // ...
      
              private Region                regionCourante      = Region.AMERIQUE;
      
              public SessionPong memoriserRegionCourante(Region region) {
                  this.regionCourante = region;
      
      
                  return this;
              }
      
              public SessionPong observerRegionCourante() {
      
                  this.setModelSelection(ModeleFileAttente.class, regionCourante.name());
      
                  return this;
              }
      

    Modifier une instance en particulier #

    • Si on envoi un message, c’est l’instance observée qui sera modifiée

      // observer l'instance AMERIQUE
          Ntro.session(SessionPong.class)
              .setModelSelection(ModeleFileAttente.class, "AMERIQUE");
      
          // comme AMERIQUE est observée
          // le message ci-bas va modifier l'instance AMERIQUE
          Ntro.newMessage(MsgAjouterRendezVous.class)
              .setPremierJoueur(/* ... */)
              .send();
      
    • On peut aussi préciser quelle instance modifier pour chaque message

      // on précise quelle instance modifier pour CE message
          Ntro.newMessage(MsgAjouterRendezVous.class)
              .setModelSelection(ModeleFileAttente.class, "AMERIQUE");
              .setPremierJoueur(/* ... */)
              .send();
      

    Les tâches et le reste du code ne change pas #

    1. On a le même graphe de tâche, p.ex.

    2. L’instance du modèle est chargée avant que le code s’exécute:

      private static void afficherFileAttente(FrontendTasks tasks) {
      
              tasks.task("afficherFileAttente")
      
                   .waitsFor(modified(ModeleFileAttente.class))  // va charger une instance du modèle
      
                   .waitsFor(created(VueFileAttente.class))
      
                   .executes(inputs -> {
      
                       VueFileAttente              vueFileAttente = inputs.get(created(VueFileAttente.class));
                       Modified<ModeleFileAttente> fileAttente    = inputs.get(modified(ModeleFileAttente.class));
      
                       // le code ne change pas, mais il s'applique à une autre instance
                       // selon l'instance observée en ce moment
                       fileAttente.currentValue().afficherSur(vueFileAttente);
      
                   });
          }
      
    Creative Commons License Creative Commons Attribution Creative Commons ShareAlike
    • Théorie: singleton Vs collection
      • Singleton
      • Collection
      • Observer une instance en particulier
      • Modifier une instance en particulier
      • Les tâches et le reste du code ne change pas