2009-07-23 19 views
0

J'ai deux listes distinctes d'entités:moyen privilégié de « déplacer » un objet entre les listes

class EntityCollection : IList<Entity> 
{ 
    //... 
} 

EntityCollection Foo; 
EntityCollection Bar; 

Je veux mettre en œuvre une opération pour déplacer un objet Qux qui est sur la liste Foo Bar. Quelle est la meilleure façon de l'implémenter?

  • En tant que méthode d'instance MoveTo sur EntityCollection:

    public void MoveTo(EntityCollection to, Entity entity); 
    
    // Client code 
    Foo.MoveTo(Bar, Qux); 
    
  • En tant que méthode d'instance MoveFrom sur EntityCollection:

    public void MoveFrom(EntityCollection from, Entity entity); 
    
    // Client code 
    Bar.MoveFrom(Foo, Qux); 
    
  • En tant que procédé Move statique sur EntityCollection:

    public static void Move(Entity entity, EntityCollection from, EntityCollection to); 
    
    // Client code 
    EntityCollection.Move(Qux, Foo, Bar); 
    
  • En tant que méthode d'instance Move la classe qui détient des collections de Both:

    public void Move(Entity entity, EntityCollection from, EntityCollection to); 
    
    // Client code 
    Holder.Move(Qux, Foo, Bar); 
    

Alternativement, et étant donné que les entités ne peuvent être une collection à la fois, je pouvais avoir la les entités suivent elles-mêmes leur emplacement et l'implémentent sur l'entité elle-même:

public void MoveTo(EntityCollection to) 
    { 
     if(Location != null) 
      Location.Remove(this); 
     to.Add(this); 
     Location = to; 
    } 

    // Client code 
    Entity e; 
    e.MoveTo(Foo); 

    // Later on... 
    e.MoveTo(Bar); 

d avec autant d'options, je veux savoir: d'où vient la méthode de déplacement? Et pourquoi?

Répondre

1

En fin de compte, je ne pense pas que ce soit trop important, donc ma réponse douce serait de ne pas s'inquiéter.

Linguisticement, MoveTo semble plus naturel que MoveFrom - bien que j'imagine que l'implémentation soit complète. D'un point de vue conceptuel, il me semble que ni les instances de collection ni l'entité déplacée ne sont "responsables" du déplacement, et cela pourrait m'inciter à mettre cela comme une méthode statique - sinon vous donnez une importance supplémentaire à un des trois choses en fonctionnement.

Construire un support pour ensuite accomplir le mouvement semble plutôt excessif.

Mais c'est vraiment à vous de décider, et une meilleure connaissance de la façon dont ces choses seront typiquement consommées peut informer quelle est la "bonne" solution.

+0

La raison pour laquelle j'ai demandé n'était pas linguistique, était exactement sur la responsabilité. Merci pour votre avis. Btw, le Titulaire existe déjà, je ne ferais qu'ajouter des fonctionnalités à celui-ci. –

+0

J'ai détaillé d'autres parties du système et j'en suis arrivé à la conclusion que le Titulaire devrait être en mesure de faire le déplacement, car il effectuera également une validation, car certaines entités ne peuvent pas être déplacées vers Bar. –

0

Comment utiliser une méthode d'extension?

code client serait:

Foo.Move(Qux).To(Bar); 

Les signatures:

public static Entity Move(this EntityCollection from, Entity entity) 
public static void To(this Entity entity, EntityCollection to) 

Fluent! MoveTo et MoveFrom vont tous deux utiliser un appel à Add() et Remove() afin que vous puissiez faire les deux dans une seule fonction.

+0

Donc, vous appelez essentiellement supprimer "déplacer" et ajouter "à". J'en aime l'apparence dans cette situation, mais je frémis de penser que le code qui utilise Move() ou To() par lui-même serait comme à lire. – Sean

+0

@ Dark Eru Oui ...: D –

+0

Je n'aime pas ça parce que je préférerais qu'il s'agisse d'une seule opération. Ma première pensée en voyant cela était exactement la même que celle de Darth Eru: et si j'écris Foo.Move (Qux)? Cela a l'air bien quand même. –

1

Dans ce cas, vous pourriez faire quelque chose comme ceci:

enum MoveDirection 
{ 
    ToFoo = 0 
    ToBar = 1 
} 

MoveItem(Entity entity, MoveDirection direction) 
{ 
    if direction = 0 
     //move entity from Bar to Foo 
    elseif direction = 1 
     //move entity from Foo to Bar 
    endif 
} 
+0

Et comment allez-vous l'utiliser? Mettez le code client dedans. –

+0

Je pense qu'il veut le mettre dans la classe qui contient les deux collections, comme ceci: 'Holder.MoveItem (Foo, ToBar)'. –

+0

'Holder.MoveItem (Foo, MoveDirection.ToBar)', je veux dire –

Questions connexes