|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : novembre 2003 Messages : 43 ![]() |
Bonjour
Avant de passer bien du temps à adapter ce pattern qui peut être ne permet pas les opération suivantes , je vous pose la question: Fais plusieurs test mais y a toujours des petites choses pour chacun qui fonctionne pas Alors question d'ordre générale. Peut on avec ce pattern: 1) RECHERCHE trouver un objet par son nom et le nous retourner l'objet de ce type ? 2) échanger deux noeuds ? 3) échanger deux branches? Merci d'avance |
|
|
00
|
|
|
#2 |
|
Membre du Club
![]() Inscription : août 2006 Messages : 61 ![]() |
Bonjour,
Le design pattern composite permet d'effectuer un même traitement par un objet unique ou par un ensemble d'objets, sans avoir à connaitre le nombre ou le type de ces objets à priori. A partir de là : 1) Oui il suffit que la classe Component (la classe de base) déclare une méthode 'getObjectsWithName(name)'. Les sous classes devront nécessairement l'implémenter. 2) et 3) La classe Composite est responsable de gérer la liste des objets, donc même si le design pattern n'est pas spécifiquement fait pour des échanges d'objet, c'est tout à fait possible de le faire. NB : Dans votre question, j'ai surtout l'impression que vous avez besoin d'une structure d'arbre. Si les possibilités offertes (indiquées plus haut) par le design pattern composite ne vous sont pas nécessaires, ce n'est peut être pas la structure la plus appropriée. |
|
|
00
|
|
|
#3 | |
|
Invité de passage
![]() Inscription : novembre 2003 Messages : 43 ![]() |
Citation:
Merci pour les réponses 1) getObjectsWithName(name) ? ! Bon il est vrai que je n'ai pas spécifié que c'était soit en c# ou en vb.net. Qu'est ce que cette méthode? Pour ta suggestion d'un arbre. c'est parce que cela doit être un arbre n-aire et non pas binaire. Et la raison pour laquelle j'avais un penchant pour le pattern composite est qu'il peut gérer du n-aire... Par contre je croyais qu'on pouvait faire avec ce pattern l'équivalent d'avec un arbre n-aire.. incluant toutes les opérations.. Est ce que je me trompe ? merci d'avance Bye |
|
|
|
00
|
|
|
#4 |
|
Membre du Club
![]() Inscription : août 2006 Messages : 61 ![]() |
Bonjour,
Je ne sais pas si c'est le mot 'méthode' qui induit en erreur? Je l'utilisais dans mon message dans le sens 'méthode de classe', c'est-à-dire une fonction définie au sein d'une classe. 'getObjectsWithName' est juste un nom arbitraire que j'ai donné à titre d'exemple. C'est cette fonction que vous devrez implémenter dans vos différentes classes. Sinon oui, le design pattern composite permet de créer des arbres n-aires. Il vous permettra sûrement de résoudre votre problème. Ce que je voulais indiquer c'est que si le seul besoin que vous avez est une structure d'arbre (binaire ou n-aire), il y a probablement des solutions plus simple que d'implémenter le design pattern composite (qui n'est pas forcément très compliqué à mettre en œuvre non plus cela dit). Utiliser le design pattern composite permet en revanche de s'assurer une grande maintenabilité. |
|
|
00
|
|
|
#5 | |
|
Invité de passage
![]() Inscription : novembre 2003 Messages : 43 ![]() |
Citation:
Il y a une arborescence de question. Chaque question à plusieurs options de réponses : Exemple l'opérateur a choisi A, B ou C. Si une option de réponse est choisi alors la prochaine question sera la suivante et ainsi de suite. À la fin il n'y pas de feuille . Peu importe les dernières questions on revient à la question 1 pour recommencer de nouveau les mêmes questions à répondre mais pour un nouveau produit. Larborescence de question est sauvé dans une Bd relationnelle et quand j'appelle celle ci je la transforme en objet avec un objet arborescence de question qui contient une liste de question qui chacune contient une liste de questions qui selon la réponse conduit à une question suivante. Donc mes deux objets de cette arborescence serait : Arborescence de question et Question Par ailleurs il y a des périphériques qui recoivent la question, retourne la réponse de l'opérateur pour être traiter . Et ensuite l'arborescence de question va indiquer aux périphériques ( équipement industriel) la prochaine question à répondre . Je pourrais faire sans arbre, sans composite mais cela va y ressembler comme solution. Si j'y vais avec des arbres n-aitre ou un pattern composite, alors a priori le composite me semblait plus simple mais je me questionne comme échanger deux noeuds , comment y insérer un branche .. puisque j'ai jamais utilisé ce pattern . Merci d'avance Bye |
|
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : novembre 2003 Messages : 43 ![]() |
Du coup à la base comment fait on pour visiter tous les noeuds à la recherche d'un noeud précis avec le design pattern composite ?
J'arrive à faire afficher l'ensemble des noeuds mais lorsque je fais une recherche en faisant une interrogation sur le noeud , il ne trouve que le noeud dont le nom qui l'appelle est le père ex pere.TrouverNoeud(unNoeud); il ne trouve que si unNoeud en est son fils immédiat. Il ne forge pas plus ... Bon évidemment récursivité ... |
|
|
00
|
|
|
#7 | ||
|
Membre du Club
![]() Inscription : août 2006 Messages : 61 ![]() |
Bonjour,
Merci pour les explications. Si j'ai bien compris :
Pour moi, l'arbre est créé une fois pour toute, pas besoin d'échanger des noeuds. Concernant la recherche, chaque noeud contient une référence vers chacun de ses fils, il n'y a pas de recherche à faire normalement. Je vais quand même essayer de répondre à vos questions concernant le design pattern composite. Citation:
Pour insérer une branche fille, il suffit donc de rajouter un objet de type Composite dans cette liste. Pour insérer un noeud fils, il faut ajouter un objet de type feuille dans la liste. L'échange de noeud se fait également via cette liste. Citation:
soit votre arbre est mal construit : Tous les noeuds ayant des fils doivent être des objets composite. Les objets de type feuille ne peuvent être que tout en bas de l'arbre |
||
|
|
00
|
|
|
#8 | ||||||||||
|
Invité de passage
![]() Inscription : novembre 2003 Messages : 43 ![]() |
Bonjour tristan
Merci pour ton aide Voir ci dessous [quote=tristan_m;6968432]Bonjour, Merci pour les explications. Citation:
Citation:
Donc des opérations qui vont se faire au préalable par le biais d'une interface en asp.net. Citation:
Citation:
Évidemment trouver un noeud est primordial pour effectuer les autres activités ci haut mentionnées ( interchanger 2 noeuds , etc.. ) J'ai fait un code pour trouverNoeud mais je pense qu'il y a quelque chose pas dans ma logique car il va toujours le trouver même si c'est pas dans la bonne arbo; c'est à dire ex : En fait voici comment j'ai fait ... finalement ex: si par exemple j'appelle Code :
Code :
Code :
Composant und= uneArboB.trouverNoeud(sousArboA); à uneArboA.. ====================================== Voici comment j'ai écrit la méthode trouveNoeud: Code :
Qu'est ce qui cloche (sans doute une erreur de débutant)? Merci d'avance pour l'aide |
||||||||||
|
|
00
|
|
|
#9 | |||
|
Membre du Club
![]() Inscription : août 2006 Messages : 61 ![]() |
Bonjour,
Je comprend mieux les besoins sur la recherche et l'échange des nœuds. Concernant votre implémentation, il y a plusieurs problèmes. Citation:
Le paramètre doit donc être un nom, pas un noeud. Citation:
Citation:
De plus lors du parcours des noeuds fils, quoiqu'il arrive, la boucle s'arrête forcément après le premier noeud puisqu'il y a un return. Il faut vérifier le retour de la fonction trouverNoeud avant de faire le return. |
|||
|
|
00
|
|
|
#10 | |
|
Invité de passage
![]() Inscription : novembre 2003 Messages : 43 ![]() |
Citation:
Je suis pas sûr de comprendre mais j'essaie de comprendre et tester tout cela et je reviens dans pas long si ma compréhension ne semble pas correcte ... |
|
|
|
00
|
|
|
#11 | ||||||||||
|
Invité de passage
![]() Inscription : novembre 2003 Messages : 43 ![]() |
Citation:
Code :
Dans classe composite Code :
Citation:
Code :
|
||||||||||
|
|
00
|
|
|
#12 | ||||||
|
Invité de passage
![]() Inscription : novembre 2003 Messages : 43 ![]() |
Bon Tristan la recherche fonctionne grâce à tes pistes de solution Merci
Alors pour le bénéfice de tout le monde: Dans classe composant Code :
public abstract Composant trouverNoeud(string nom); Code :
Code :
Dans le main , exemple si vous êtes en console N.B: j'ai fait mon code exemple en C# Évidemment cela suppose qu'au préalable vous ayez creer des noeuds ici unArbo est la racine En paramêtre de la fonction le nom d'une des noeuds sous la racine Évidemment je gère ici un retour null dans l'affichage car sinon plantage Code :
Bon à partir du moment où ma recherche d'un noeud fonctionne , le reste devrait être plus facile. Je reviens avec des questions si pas les solutions sont pas évidentes Merci encore |
||||||
|
|
00
|
|
|
#13 | ||
|
Invité de passage
![]() Inscription : novembre 2003 Messages : 43 ![]() |
Bon grace à trouver un noeud, j'ai réaliser interchanger deux noeuds, insérer noeud, insérer une arborescence, etc
En mode console c'est facile de faire afficher l'arborescence au complet avec dans la classe composite Code :
mais comment je fais pour récupérer la liste et en sortir toutes les string de nom par exemple de chaque noeud .. Autrement dit une liste de string pouvant être affiché dans une interface asp.net. ? Quand je récupère la liste "uneListe" à même l'arborescence comme ci haut dans ma foreach en mode console j'obtiens toute l'arborescence et pourtant il n'y pas d'appel récursif. Par contre si je veux récupérer cette liste et afficher dans une interface asp.net, je ne récupére que les fils directs de la racine, que sa propre liste. Pourquoi là j'aurais besoin d'un appel récursif et que j'en ai pas besoin dans un display en mode console comme ci haut?!!!! Merci d'avance |
||
|
|
00
|
|
|
#14 | |||
|
Invité de passage
![]() Inscription : novembre 2003 Messages : 43 ![]() |
Citation:
Pas évident à adapter à un situation donnée ce pattern lorsqu'on le fait pour la première fois lol |
|||
|
|
00
|
|
|
#15 |
|
Membre du Club
![]() Inscription : août 2006 Messages : 61 ![]() |
Bonjour,
Content que vous ayez pu résoudre vos problèmes de recherches et d'échanges de nœuds. Par contre j'ai peur de ne pas avoir compris votre dernier problème. La méthode display est récursive. EDIT : Désolé, je n'ai pas vu que vous aviez trouvé la solution finalement |
|
|
00
|
|
|
#16 | |
|
Invité de passage
![]() Inscription : novembre 2003 Messages : 43 ![]() |
Citation:
Tu m'as beaucoup aidé merci. Là j'expérimente diverses choses car j'ai jamais utilisé ce pattern. J'essaie d'adapter pour mon besoin. Pour qu'il soit utilisable pour mon besoin il faut qu'il me permette plusieurs types d'opération. Là en ce moment j'essai de voir comment si j'utilise ce pattern, comment je vais faire pour afficher en arborescence dans une interface asp.net, ce qui me viendra de ma couche domaine en passant par une facade... Évidemment si j'ai une facade entre la couche présentation et la couche domaine, alors je ne peux que renvoyer des strings et nombre dans ma couche présentation. Et le seul objet qui sera crée dans mon code behind en asp.net sera l'objet facade.. Ce qui est pas évident c'est comment l'afficher en arborescence car une string en elle même ne dit pas si elle fait partie d'une liste de noeud (question) appartenant à tel père ... Autrement dit ma couche facade elle aura la liste des Composants, mais pour respecter l'esprit d'une facade ( et donc d'une séparation complète de couche) je ne peux caster ( en ArboQuestion et question) dans mon code behind d'asp.net . Ne pouvant caster, comment mon code behind pourra savoir comment afficher ce qui est un père et ce qui fils de ..? Car l'admin utisera une interface et il manipulera l'arborescence affiché dans cette interface ajouter un noeud, interchanger etc... Je cogite cela en ce moment |
|
|
|
00
|
|
|
#17 |
|
Invité de passage
![]() Inscription : novembre 2003 Messages : 43 ![]() |
Sans garder en mémoire le père d'un composite, comment je fais pour le trouver ?
Car pour faire des opérations comme supprimer ou ajouter (pour lequel on ne passe en paramètre que le noeud qu'on veut enlever ou ajouter), il faut bien trouver à quel père cela fait référence . Dans un composite par défaut , cette information n'est pas conservée! Merci d'avance |
|
|
00
|
|
|
#18 | |
|
Invité de passage
![]() Inscription : novembre 2003 Messages : 43 ![]() |
Citation:
En le gardant vide c'est moins de chose à modifier lorsqu'on change des noeuds etc. Et après un changement de noeud par exemple, je rappelle ma fonction qui remet à jour la totalité des champs Père . Je ne sais pas par contre s'il est correct et élégant de faire ainsi et de garder un champs Pere dans un pattern composite ... |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com