Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Discussion: Observable - Observer

  1. #1
    Membre actif
    Homme Profil pro Yannick M
    Étudiant
    Inscrit en
    janvier 2010
    Messages
    158
    Détails du profil
    Informations personnelles :
    Nom : Homme Yannick M
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2010
    Messages : 158
    Points : 180
    Points
    180

    Par défaut Observable - Observer

    Dans le cadre d'un projet conçu dernièrement, je devais avoir plusieurs vues différentes du même modèle de données. En l'occurrence, ce modèle était sous forme d'instance de classe Windev gérant différents calculs.

    Dans ce contexte, le patron de conception qui me semblait le meilleur était le modèle Observable-Observé (http://fr.wikipedia.org/wiki/Observa..._de_conception)).

    Objectif

    Envoyer un signal à toute instance observant la classe héritant d'Observable.

    Mise en oeuvre

    La mise en oeuvre est relativement simple et consiste en deux classes. La première, Observable, contient un tableau de pointeur d'Observers et des méthodes d'ajout / de suppression et de notification.

    Il suffira de faire appel à la notification lorsqu'on voudra que toutes les vues correspondantes se mettent à jour.

    Observer quant à lui se contente de définir la méthode update() qui devra être redéfinie dans chacune de ses sous-classes pour que le polymorphisme fonctionne correctement.

    Enough word, let's code

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Observer est une classe
    
    FIN
    
    
    PROCEDURE PRIVÉE Constructeur()
    
    
    PROCEDURE PRIVÉE Destructeur()
    
    
    PROCEDURE VIRTUELLE update()
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Observable est une classe
    PRIVÉ
    	observateurs est un tableau d'Observer dynamique
    FIN
    
    
    PROCEDURE Constructeur()
    PROCEDURE Destructeur()
    // Résumé : Notifie tous les observateurs qu'ils doivent se mettre à jour
    // Syntaxe :
    // notify ()
    //
    // Paramètres :
    //	Aucun
    // Valeur de retour :
    // 	Aucune
    //
    // Exemple :
    // Indiquez ici un exemple d'utilisation.
    //
    PROCEDURE PUBLIQUE notify()
    
    POUR CHAQUE o DE observateurs
    	o.update()
    FIN
    
    // Résumé : Ajoute un observer au tableau
    // Syntaxe :
    //addObserver (<o> est Observer dynamique)
    //
    // Paramètres :
    //	o (Observer dynamique) : <indiquez ici le rôle de o>
    // Valeur de retour :
    // 	Aucune
    //// Exemple :
    // Indiquez ici un exemple d'utilisation.
    //
    PROCEDURE PUBLIQUE addObserver(o est un Observer dynamique)
    TableauAjoute(observateurs,o)
    
    // Résumé : Retire l'observateur à l'indice indiqué
    // Syntaxe :
    //removeObserver (<indice> est entier)
    //
    // Paramètres :
    //	indice (entier) : indice de l'observateur dans le tableau
    // Valeur de retour :
    // 	Aucune
    //// Exemple :
    // Indiquez ici un exemple d'utilisation.
    //
    PROCEDURE PUBLIQUE removeObserver(indice est un entier)
    TableauSupprime(observateurs,indice)
    Il vous suffira alors de faire hériter vos Modèles à Observable et vos vues à Observer, redéfinir la méthode update pour que la vue se mette à jour, et c'est gagné !

    Sous des airs très basiques, ce patron de conception est très puissant et permet une cohésion des données affichées très facilement.

    J'attend vos retours ! ;-)

  2. #2
    Membre émérite

    Développeur informatique
    Inscrit en
    mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2009
    Messages : 402
    Points : 802
    Points
    802

    Par défaut

    Merci pour ta contribution,
    je m'intéresse aussi pas mal à la POO sous WD avec plus ou moins de bonheur.
    Je garde ton Pattern sous le coude et je l'appliquerai au plus tôt.
    As tu travaillé sur un pattern Singleton en WD?
    Quel avantage avec une variable globale déclarée au niveau du projet?
    Je te tiens au courant de l'application de Observer/Observable

    BJ

  3. #3
    Membre actif
    Homme Profil pro Yannick M
    Étudiant
    Inscrit en
    janvier 2010
    Messages
    158
    Détails du profil
    Informations personnelles :
    Nom : Homme Yannick M
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2010
    Messages : 158
    Points : 180
    Points
    180

    Par défaut

    Hello !

    "Indirectement". C'est-à-dire que j'ai créé quelques classes (Générateurs d'objets par exemple) qui sont considérées comme Singleton mais ne sont pas codées spécialement pour. C'est juste à moi (ou mes collègues) de bien faire gaffe à pas lancer de deuxième instance !

    D'ailleurs, c'est une question intéressante. Je me pencherai sur les propriétés statiques

  4. #4
    Membre émérite

    Développeur informatique
    Inscrit en
    mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2009
    Messages : 402
    Points : 802
    Points
    802

    Par défaut

    Alors voilà je me lance dans ce pattern...
    Imaginons 5 listes combos chargées d'affiner une recherche
    Exemple (presque un cas d'école) :
    Combo_Article= affiche les données de Article
    Combo_Rayon= affiche les données de Rayon
    Combo_Famille= affiche les données de Famille
    Combo_SousFamille= affiche les données de SousFamille
    Combo_Saison= affiche les données de Saison

    Alors on est dans le cas des listes liées...
    J'imagine qu'on peut gérer ça avec ce pattern mais c'est encore un peu flou.

    Nous disons donc

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    observableCombo est une classe
    	nomCompletChampCombo est une chaîne
    	fichierLie est une chaîne
    	rubAffiche est une chaîne
    	rubMemorise est une chaîne
     	tableLiaisons est un tableau associatif de chaînes
    FIN
    et

    une classe observer...

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •