0

私は2つの別々のエンティティのリストを持っています:

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

EntityCollection Foo;
EntityCollection Bar;

QuxリストFooにあるオブジェクトをBarに移動する操作を実装したいと思います。それを実装するための最良の方法は何ですか?

  • MoveToインスタンスメソッドとしてEntityCollection

    public void MoveTo(EntityCollection to, Entity entity);
    
    // Client code
    Foo.MoveTo(Bar, Qux);
    
  • MoveFromインスタンスメソッドとしてEntityCollection

    public void MoveFrom(EntityCollection from, Entity entity);
    
    // Client code
    Bar.MoveFrom(Foo, Qux);
    
  • 上の静的MoveメソッドとしてEntityCollection

    public static void Move(Entity entity, EntityCollection from, EntityCollection to);
    
    // Client code
    EntityCollection.Move(Qux, Foo, Bar);
    
  • Move両方のコレクションを保持するクラスのインスタンスメソッドとして:

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

または、エンティティは一度に1つのコレクションにしか存在できないため、エンティティに自分の場所を追跡させ、エンティティ自体に実装することができます。

    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);

非常に多くのオプションが提示されたとき、私は知りたいです:moveメソッドはどこに属しますか?なぜ?

4

3 に答える 3

1

結局のところ、それほど重要ではないと思うので、私のソフトな答えは心配しないことです。

言語的には、MoveToはMoveFromよりも自然に見えますが、完全を期すために両方を実装することは想像できます。

概念的には、コレクションインスタンスも移動されるエンティティも移動に「責任」がないように感じます。そのため、これを静的な方法と見なす傾向があります。そうしないと、3つのことのいずれかに特別な重要性が与えられます。動作中。

移動を実行するためにホルダーを作成することは、かなり過剰に思えます。

しかし、それは本当にあなた次第であり、これらのものが通常どのように消費されるかについてのより多くの知識は、「正しい」解決策が何であるかを知るかもしれません。

于 2009-07-24T02:10:31.103 に答える
1

MoveTo と MoveFrom はどちらも Add() と Remove() の呼び出しを使用するため、これらの両方を 1 つの関数で実行できます。その場合、次のようなことができます。

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
}
于 2009-07-23T20:13:45.493 に答える
0

拡張メソッドを使用するのはどうですか?

クライアント コードは次のようになります。

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

署名:

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

流暢

于 2009-07-23T20:08:50.277 に答える