Archives Wild Code School
C#

Design Patterns - Composite

Quête 38 sur 46

Tu apprendras comment représenter une arborescence à l'aide du design pattern Composite

Un arbre généalogique

Tu veux réaliser l'arbre généalogique d'une famille.

Cependant, cet arbre doit tenir des siècles et doit pouvoir être étendu à jamais. Plutôt que d'écrire l'arbre généalogique sur papier, tu décides d'écrire une application qui permet de représenter un arborescence.

Le Composite

Le composite est un design pattern **très fréquemment **utilisé, beaucoup plus que le Singleton. Il est utilisé dans un cas très récurrent: celui où une arborescence doit être représentée. Cela arrive pour des fichiers, des employés, une famille, des comptes bancaires ... Bref, on retrouve une utilisation de ce design pattern partout.

Plusieurs techniques et algorithmes permettent de représenter une arborescence, mais une des plus simples restent l'utilisation de ce pattern.

Et pourquoi le Composition est plus simple que d'autres techniques ? Qu'est-ce qui le rend aussi populaire ?

De manière algorithmique, les hiérarchies et arborescences sont représentés par des arbres binaires. Les arbres binaires sont des structures de données avancées dont les utilisations sont courantes. Cependant un arbre binaire reste assez complexe et il est surtout adapté à des cas de prises de décision. On peut faire plus simples dès lors qu'il s'agit du stockage d'informations ou du traitement uniforme de plusieurs d'objets.

En fait, la magie du Composite est qu'il permet de créer une arborescence de manière très simple ! Une classe a en propriété une liste d'autres objets et chaque objet de la liste peut contenir d'autres objets ect ... Cette conception permet à une arborescence d'exister et cela en utilisant un objet simple et non pas un arbre binaire compliqué.

↗
Un arbre binaire
fr.wikipedia.org

L'implémentation

L'implémentation de ce design pattern peut-être réalisé de plusieurs manières. Certains développeurs implémentent dans un objet utilisé le pattern composite - cet objet contenant une liste d'autres objets - et permet donc à l'objet de référencer tous ses enfants et de les récupérer à partir de lui. D'autres équipes écrivent une classe à part qui permet de manipuler la liste d'objets d'un autre. Cela dépend des goûts et des cas d'utilisation.

Son implémentation est relativement simple et rudement détaillée sur la Toile.

↗
↗
Le design pattern compositie - C#
infoworld.com

Challenge

Ton challenge est le suivant: tu vas implémenter un programme représentant un arbre généalogique à partir d'un seul géniteur. Il est donc possible de reconstituer tout l'arbre généalogique en partant du premier géniteur.

Critères de validation

  • L'application contient une classe Person qui représente le membre d'une famille

  • Person a une liste d'autres Person en propriété. Cette liste contient les descendants directs

  • Chaque Person a une méthode ToString() retournant sous format textuel ses descendants directs

  • En appelant la méthode ToString() d'un seul Person tous les descendants du membre de la famille en question sont renvoyés sous format textuel