1

このモデルをセットアップする最良の方法を見つけようとしています。ほぼ一通りやったのですが、別の方法を検討中です。これは学習体験なので、無駄な時間は問題ではありません。

namespace FirstWay
 {

public class CrateOfBags
{
    public string crateId { get; set; }
    public string originCountry { get; set; }
    public List<BagOfApples> bagList { get; set; }
}

public class BagOfApples
{
    public double weight { get; set; }
    public string bagId { get; set; }
    public List<apple> appleList { get; set; }
}

public class apple
{
    public string appleId { get; set; }
    public string color { get; set; }
    public Boolean rotten { get; set; }
}
}

//またはこれ

 namespace SecondWay
   {
public class CrateOfBags
{
    public string crateId { get; set; }
    public string originCountry { get; set; } 
}

public class BagOfApples : CrateOfBags
{
    public string bagId { get; set; }
    public double weight { get; set; }
}

public class apple : BagOfApples
{
    public string appleId {get;set;}
    public string color { get; set; }
}

}

考えられる質問

アップルの質問 : 腐ったリンゴは何個配達されましたか? 腐ったリンゴはどの袋や箱から出てきましたか? 最初の方法: 各クレート、バッグ、リンゴ、カウントの順にループできます。2 番目の方法: りんごだけをループして、親プロパティを HashSet に追加することができます (重複を防ぐ 1 つの方法)。

クレートの質問。各国からの箱の数を見つけますか? 最初の方法: クレートだけをループして、カウントリスト、配列などを保持します。2 番目の方法: すべてのリンゴをループ処理し、箱のみを処理する必要があります。

私が直面した問題の 1 つは、リンゴ自体についてほとんど知らないことです。クレートからforeachループを開始することによってのみ、それがどのクレートからのものかを知っています

しかし、「特定のバッチ (ID による) には青リンゴがいくつあるか?」などの質問をしたい場合は、方法によっては私も問題を抱えています。

犬が動物の子であるのと同じように、りんごが袋の子であると言うのは、私には厄介に思えます。ただし、親プロパティの bagid を変更するだけでリンゴが入っているバッグを切り替えるなど、リンゴを自由に動かして操作できるというアイデアが気に入っています。特定の質問に対する解決策を探しているのではなく、これらのいずれかが別のものよりも優れているか (より柔軟で効率的で直感的)、または別の手法を使用するなど、何かが完全に欠けているかどうかだけです。どうもありがとう。

PS これは実際のモデルではありませんが、かなりまともな表現です。

4

2 に答える 2

5

2 番目のアプローチは、データ モデリングの観点からは明らかに間違っているように見えます。リンゴBagOfApples ではありません。継承は代替可能性を生み出すはずです: BagOfApples が期待される場所に常にリンゴを置くことができますか? 私はそうは思わない。これがリスコフの置換原理です (そして、これは破られています)。

データベース用語では、2 番目のモデルは非正規化されています。3 つのテーブルすべてを結合して冗長データを作成することにより、最初のモデルから作成できます。何かを変更する場合、複数の場所で変更する必要があるため、これはアンチ パターンです (それがサイレント データ破損であることを忘れている場合)。

于 2013-02-20T22:56:42.943 に答える
3

りんごが袋の子だなんて言い方がおかしい気がする

神様、それは間違っているからです。リンゴバッグではないため、継承すべきではありません。

最初のモデルは問題ないようです。私が検討する唯一の提案はBag、再利用できるようにジェネリック化することです。

public class CrateOfBags<T>
{
    public string crateId { get; set; }
    public string originCountry { get; set; }
    public List<Bag<T> bagList { get; set; }
}

public class Bag<T>
{
    public double weight { get; set; }
    public string bagId { get; set; }
    public List<T> ItemList { get; set; }
}

public class apple
{
    public string appleId { get; set; }
    public string color { get; set; }
    public Boolean rotten { get; set; }
}

私はリンゴがそれ自身の実体であることについてほとんど知りません。クレートから foreach ループを開始することによってのみ、それがどのクレートからのものかがわかります。

これは、後方参照を使用することで解決されます。つまり、リンゴには、作成への参照があるバッグへの参照があります。ただし、これは常に意味があるとは限りません。特に、複数のコンテナ タイプが含まれている可能性があるApple場合や、Apple がそのバッグについて認識してはならない場合は特にそうです。

于 2013-02-20T23:00:42.103 に答える