2010-02-12 3 views
0

Je suis la conception d'une bibliothèque de classes qui sera utilisé comme ceci:conception Classe: Etat de compensation

Engine eng = new Engine(); 
eng.AddPart(part).AddPart(otherPart).Run(); 

Le problème avec la classe est que les pièces sont conservées par le moteur, donc si vous voulez Run avec certains d'autres pièces dont vous aurez besoin pour supprimer celles que vous avez déjà ajoutées. Il y a plusieurs solutions possibles mais je ne suis pas sûr de savoir lequel est le meilleur.

1. Ignore dans la bibliothèque de classe, les utilisateurs appelleront new chaque fois qu'ils ont besoin de se défaire de vieilles pièces.

2. jeter automatiquement les pièces lorsque Run est appelé

3. Ajouter Clear méthode

4. au lieu de retourner l'objet courant de la méthode AddPart (return this) renvoie la nouvelle instance de Engine et faire ne modifie pas le courant.

5. Implémentez IDisposable de manière à ce que l'utilisateur puisse l'insérer dans l'instruction, même si aucune ressource ne doit être supprimée. Les utilisateurs utilisent comme ceci:

Engine eng = new Engine(); 
    using(eng) 
    { 
     eng.AddPart(part).Run(); 
    } 

L'inconvénient de la seconde est qu'il les utilisateurs pourraient avoir besoin de réutiliser le même et n'attendre à ce que les pièces sont effacées. Le troisième est bien, mais les utilisateurs peuvent oublier d'appeler la méthode Clear. La quatrième option allouera de nombreuses instances et la cinquième est non intuitive.

Des suggestions?

+1

Seule Yugo a déjà implémenté l'option 2. –

Répondre

1

La méthode Clear() est le choix le plus approprié ici; soit cela, ou tout simplement exiger que l'utilisateur crée un nouveau Engine. Clear() rend le comportement de votre bibliothèque le plus évident.

Vous pouvez également envisager de surcharger la méthode Run() d'accepter une ou plusieurs parties. Cette version de Run() exécuterait simplement les parties, ne les retient pas.

0

Vous pourriez avoir une méthode remove qui prend une partie en tant que paramètre et seulement supprimer cette partie du moteur. Implémenter IComparable sur chaque partie.

1

OMI vous devez ajouter une méthode Clear pour rendre l'interface complète.

Cependant, pour moi, il ne semble pas très logique que le même objet moteur être réutilisé avec des configurations différentes. Je pense que si un client veut un moteur différent, il devrait créer une instance de moteur distincte.

Cela pourrait en effet être transformé en un Builder.

0
Engine eng = new Engine(); 
eng.AddPart(part).AddPart(otherPart).Run(); 

devrait être le même que:

Engine eng = new Engine(); 
eng.AddPart(part); 
eng.AddPart(otherPart); 
eng.Run(); 

Run() ne devrait pas faire toute autre chose, et peut-être cette classe pourrait aussi bien gérer les accès concurrents.

Donc, je pense que le premier est le meilleur.