2011-03-24 4 views
6

J'ai une question sur deux opérations que vous voyez couramment dans un exemple de diagramme de classes composites.
* GetDescendents
* GetChild (int)questions de conception de modèles composites

Un exemple courant étant des fichiers et répertoires, je vais rester avec ça. Supposons que l'opération qui nous intéresse soit Size, donc le fichier a une taille réelle et Directory a une taille dérivée de l'itération récursive de GetDescendents. Jusqu'ici tout va bien. Ma question concerne l'utilisation de GetDescendents par le client. Dites que vous avez besoin des fichiers dans un répertoire qui sont des images pour une opération donnée. Donc en pratique, vous utilisez une combinaison de GetDescendents et Children pour renvoyer les imagesFiles (selon que le client voulait tous les fichiers image imbriqués ou juste au niveau racine).

Donc la question numéro un est, auriez-vous probablement une méthode GetImageFiles sur le composite, plutôt que de le faire comprendre au client? Et en supposant ainsi, GetDescendents est-il toujours pratique d'exposer aux clients appelants (comme le ImageViewer) en dehors de la composition?

La deuxième question à propos de GetChild (int); est l'int un index de position ordinale pour retourner un seul enfant? Un niveau de profondeur dans GetDescendents? Quel serait un exemple de la façon dont un client utiliserait cette méthode?

Cheers,
Berryl

Répondre

4

Ces questions ne sont pas sur le modèle composite en soi, mais sur le plus gros problème de la façon dont vous faites la conception de l'API et de communiquer clairement votre intention en tant que développeur de classe. Par exemple, si vous voulez que votre GetChild(int) donne l'enfant immédiat indexé, vous pouvez l'appeler GetChildAtIndex(int index); si vous voulez qu'il donne aux enfants un certain niveau dans la hiérarchie, vous pouvez le nommer GetChildrenAtLevel(int level) (notez que ceci est pluriel et renvoie une collection).

C'est à vous, en tant que concepteur de classe, d'exposer suffisamment d'opérations pour rendre votre classe compréhensible et utilisable. Si vous pensez qu'une opération très courante consiste à obtenir les fichiers image sur votre structure de répertoire, vous pouvez exposer une méthode GetAllImageFiles(). Cependant, pour une classe de répertoire plus générale, ce choix semble arbitraire et c'est au mauvais niveau d'abstraction. Pourquoi les fichiers image sont-ils si spéciaux? Vous pourriez, à la place, fournir une méthode plus générale qui obtiendrait tous les fichiers basés sur leurs extensions ou une méthode qui prend un prédicat pour filtrer les résultats en fonction des critères fournis par le client.

+0

Exactement. Ma question est-elle * jamais * logique d'exposer des opérations d'enfants à des clients qui ne font pas partie de la composition, ou du moins ont une relation très intime avec elle - c.-à-d., Opérations internes pour produire une opération consommable client comme GetFilesOfType(). – Berryl

+0

@Berryl: cela dépend de ce que votre classe représente. Le "pattern" est juste un détail d'implémentation, l'important est le "concept". –

Questions connexes