Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > WinDev > Contribuez
Contribuez Vos contributions pour la rubrique Windev : articles, cours, tutoriels, faq, comparatifs, tests, sources, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/03/2012, 14h58   #1
lazariel
Membre actif
 
Homme Yannick M
Étudiant
Inscription : janvier 2010
Messages : 156
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 : 156
Points : 176
Points : 176
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 ! ;-)
lazariel est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/08/2012, 15h16   #2
Atsibat
Membre expérimenté
 
Développeur informatique
Inscription : mars 2009
Messages : 300
Détails du profil
Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2009
Messages : 300
Points : 574
Points : 574
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
Atsibat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2012, 10h48   #3
lazariel
Membre actif
 
Homme Yannick M
Étudiant
Inscription : janvier 2010
Messages : 156
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 : 156
Points : 176
Points : 176
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
lazariel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2012, 17h58   #4
Atsibat
Membre expérimenté
 
Développeur informatique
Inscription : mars 2009
Messages : 300
Détails du profil
Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2009
Messages : 300
Points : 574
Points : 574
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...
Atsibat est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h22.


 
 
 
 
Partenaires

Hébergement Web