1

たとえば、クラスがある場合:

public class StuffHolder
{

    List<Stuff> myList;

    public StuffHolder()
    {
        myList = newList<Stuff>();
        myList.Add(new Stuff(myList));
        myList[0].stuffHappens();
    }

}

スタッフ オブジェクト:

public class Stuff
{
    List<Stuff> myList;

    public Stuff(List<Stuff> myList)
    {
        this.myList = myList;
    }

    public void stuffHappens()
    {
        myList.Remove(this);
    }
}

削除する必要があるという情報を StuffHolder クラスに渡して StuffHolder クラスにその特定の Stuff を削除させるのではなく、stuffHappens() を呼び出すことの欠点は何ですか?

4

3 に答える 3

5

List<T>コレクションはスレッドセーフではないため、stuffHappens() が一度に複数のスレッドで発生すると危険です。

より大きな危険は責任の混乱です。コレクションに格納されていることを知るのはスタッフの仕事ではないはずです。この種の設計の「あいまいさ」は、システムが成長し進化するにつれて、ますます混乱を引き起こします。

于 2012-07-03T00:03:02.003 に答える
0

これは確実に機能します (つまり、Stuff オブジェクトがリストから削除されます)。

問題は、そもそもなぜ StuffHolder を持っているのかということです。通常、そのようなコレクションをラップするときは、いくつかの不変条件を維持したり、いくつかのデータをキャッシュしたりするために行っています。このようにリストを使用すると、不変条件に違反する可能性があります。

基本的に問題は、オブジェクトがリストから削除されたことを StuffHolder が認識できないことです。それがあなたの特定の状況にとって問題であるかどうかはあなた次第です。

于 2012-07-03T00:02:55.657 に答える
0

コード的には可能なのでOKです。答えは、何をモデリングしているか、作成したデザインによって異なります。そのソリューションが適切でないシナリオもあれば、適切なシナリオもあるかもしれません。必要に応じて、何を達成しようとしているのかを共有して、それについて話し合うことができます。

それが役に立てば幸い。

于 2012-07-03T00:04:33.643 に答える