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

}

可能的问题

苹果问题:交付了多少烂苹果?烂苹果来自哪些袋子和/或哪些板条箱?第一种方式:可以遍历每个板条箱,然后是袋子,然后是苹果和计数。第二种方式:可以循环遍历苹果并将父属性添加到 HashSet(一种防止重复的方法)

板条箱问题。查找每个国家/地区的板条箱数量?第一种方式:循环遍历箱子并保留一个计数列表、数组等。第二种方式:必须遍历所有苹果并且只关心板条箱。

我遇到的一个问题是我对苹果作为它自己的实体知之甚少。我只知道它来自哪个板条箱,方法是从板条箱启动 foreach 循环

但是,如果我想问一个问题,例如“特定批次中有多少青苹果(按 id)?” 我也有问题,具体取决于方式。

说苹果是袋子的孩子,就像狗是动物的孩子一样,对我来说似乎很尴尬。然而,我喜欢能够自由移动操纵苹果的想法,例如通过更改父属性 bagid 来切换它们所在的包。我并不是在寻找特定问题的解决方案,而只是其中一个更好(更灵活,更有效,更直观)然后另一个,或者如果我完全错过了某些东西,例如使用另一种技术。非常感谢。

PS 这不是真正的模型,而是一个相当不错的表示。

4

2 回答 2

5

从数据建模的角度来看,第二种方法显然是错误的:苹果不是BagOfApples。继承应该创造可替代性:你能总是把苹果放在需要 BagOfApples 的地方吗?我不这么认为。这是 Liskov 替换原则(它被违反了)。

在数据库方面,第二个模型是非规范化的。它可以通过将所有 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; }
}

我对苹果作为它自己的实体知之甚少。我只能通过从 crate 启动 foreach 循环来知道它来自哪个 crate。

这是通过使用反向引用来解决的,这意味着一个苹果有一个对它的包的引用,它有一个对它的创建的引用。然而,这并不总是有意义的,特别是如果有多种容器类型可以包含一个Apple或者如果 Apple 不应该知道它的包。

于 2013-02-20T23:00:42.103 回答