4

次のクラス図を検討してください。

 +--------+     * +------------------+ * afraid-of             +------------+
 | Garden |------>|    Animal        |<------------------------| Baby       |
 +--------+       +------------------+                         +------------+
                        ^
                        |
                 +----------+------+
                 |                 |
          +------+------+   +------+-----+
          | Cat         |   | Wolf       |
          +-------------+   +------------+

動物には 2 つの役割があります。

  1. 彼らは庭を歩き回ります(クラスインスタンス)
  2. 赤ちゃんは何匹かの動物を怖がっている (Class Type)

どの赤ちゃんを飼うべきですか?それが恐れている各動物の 1 つのインスタンス? (デザインが悪いように聞こえます) 型名は?(私は常にリファクタリングを避けるようにしています)

これはどのように解決する必要がありますか?(私は C# を使用していますが、言語に依存しない一般的な設計パターンまたはアイデアがここにあることを願っているため、最後にのみ言及します)

ありがとう

4

3 に答える 3

4

赤ちゃんがいつも同じ動物を怖がっているなら、何も飼う必要はありません。メソッドを持つことができます:

public bool IsAfraid(Animal animal)
{
    return animal is Wolf;
}

赤ちゃんがさまざまな場所や時間でさまざまな動物を恐れている場合は、すべての動物にプロパティ AnimalType (フラグ列挙型) を持たせる必要があります。赤ちゃんには、AnimalType 型のプロパティ AfraidOf があります。次に、動物が怖いかどうかを確認するのは簡単です。

bool afraid = this.AfraidOf.HasFlag(animal.AnimalType);

最後に、おそらく、スキーマ内のさまざまなタイプの関係 (含む、継承、恐れる) に対して、さまざまなクラスへのさまざまなタイプのリンクを用意する必要があります。

于 2012-04-21T17:13:50.680 に答える
0

別のオプションは、動物に機能を追加することです。

public class Animal
{
    public virtual bool EatsSmallChildren { get { return false; } }
}

そうすれば、赤ちゃんが怖いかどうかではなく、動物が怖いかどうかを確認できます。

これはあなたの動物クラスに負担をかけ、いくつかの概念的な結合を導入しますが、非常に単純で理解しやすく、維持するのも簡単です。

于 2012-04-21T18:02:19.017 に答える
0

ABabyは自分が恐れている動物のリストを持つことができます。動物をリストから追加および削除するための独立した方法を指定します。時間の経過とともに、一部の動物を削除または追加できます。プロパティを介して動物のリストを直接変更することは可能ですが、この場合は特定の方法をお勧めします。

public class Animal { }
public class Cat : Animal { }
public class Wolf : Animal { }

public class Baby
{
    public List<Animal> ScaryAnimalsList { get; private set; }

    public Baby()
    {
        ScaryAnimalsList = new List<Animal>();
    }

    public void AddAnimalToScaryList(Animal animal)
    {
        ScaryAnimalsList.Add(animal);
    }

    public void RemoveAnimalFromScaryList(Animal animal)
    {
        if (ScaryAnimalsList.Contains(animal))
            ScaryAnimalsList.Remove(animal);
    }

    public bool IsAffraidOf(Animal animal)
    {
        return ScaryAnimalsList.Contains(animal);
    }
}

で、使い方はこんな感じ

class Program
{

    static void Main(string[] args)
    {
        Cat cat = new Cat();
        Wolf wolf = new Wolf();

        var babyJo = new Baby();
        babyJo.AddAnimalToScaryList(wolf);
        babyJo.IsAffraidOf(wolf);   //true
        babyJo.IsAffraidOf(cat);    //false

        var babySam = new Baby();
        babySam.AddAnimalToScaryList(wolf);
        babySam.AddAnimalToScaryList(cat);
        babySam.IsAffraidOf(wolf);   //true
        babySam.IsAffraidOf(cat);    //true

        var babyBob = new Baby();
        babyBob.IsAffraidOf(wolf);   //false
        babyBob.IsAffraidOf(cat);    //false
    }
}
于 2012-04-21T17:45:33.433 に答える