我有OO设计/数据库问题。我正在使用实体框架5在Microsoft MVC v4中编码。 假设模型如下:
public class Car
{
public int Id {get; set;}
public string Name {get; set; }
public int Wheels {get; set;}
}
public class Truck : Car
{
public int CargoCapacity {get; set;}
}
public class Bus : Car
{
public int PassangerCapacity {get; set;}
}
稍后我可能想要扩展模型,因此必须考虑这一点。例如:添加一辆具有'NumberOfTurbos'属性的赛车。
遵循良好的OO设计原则:
问题1: 这些都应该在单独的类中,还是全部在一起使用修饰符。 从OO方面看原则分离我会说它们分开了。同样关闭/打开原则规定它们应该拆分,这将有助于我以后添加赛车时不必更改任何有关公共汽车,卡车等的信息。
问题2: 他们都应该在同一个数据库表中吗?即使我不认为类的数量应该决定表的数量,我仍然会选择单独的表,以便DB被标准化,并且整个地方都没有未使用的字段。默认情况下,代码优先将它全部放在一个表中,但我已将它与类模式属性分开。
问题3: 如果我应该编程到一个接口而不是一个具体的类(OO原则再次)将如何工作,因为如果我有类似ICar的东西,这是由具体的类汽车实现的,将东西投射到ICar是行不通的。像List< ICar>不会给我所有正确的数据。同时对接口ICAR实现MVC视图也很困难。
我是否应该将接口放在仅属性类上?我应该在这里使用类似存储库或其他模式/想法的东西吗?
为长期问题道歉,我感谢任何帮助。 提前致谢。 麦克
答案 0 :(得分:0)
回答1:
是的,这些应该分成多个类。您可以通过将Car
标记为抽象来进一步扩展它,因为它是其他类型汽车的基类。您还必须将属性标记为抽象,如下所示:
abstract class Car
{
abstract public int Id;
}
虽然更好的名称可能是Vehicle
。
回答2:
您可以将这些内容存储在一个名为Vehicle
的表中,并有一个VehicleType
表。
表格工具:
Id VehicleName VehicleType
1丰田1
2川崎2
表格VehicleType:
Id VehicleDescription
1辆汽车
2摩托车
3卡车
回答3:
如果您使用了一个接口并拥有一个List,那么您将被限制为ICar
接口公开的属性/字段。但是,您可以将其转换为适当的VehicleType。
答案 1 :(得分:0)
问题1:这些都应该是单独的类,还是全部都带有修饰符。从OO方面看原则分离我会说它们分开了。同样关闭/打开原则规定它们应该拆分,这将有助于我以后添加赛车时不必更改任何有关公共汽车,卡车等的信息。
现实地分类,每个项目类型一个类。这也将是未来的证据,因为您对任何类别的任何更改都不一定会影响其他类。将来分享的任何添加内容都可以存在于基类中。
问题2:它们是否都在同一个数据库表中?即使我不认为类的数量应该决定表的数量,我仍然会选择单独的表,以便DB被标准化,并且整个地方都没有未使用的字段。默认情况下,代码优先将它全部放在一个表中,但我已将它与类模式属性分开。
绝对不是。是的,它更容易查询,但您查询的数据量实际上会增加。另外,你有效地对你的数据库设计进行了非规范化处理,更不用说有一堆可以为空的字段了,如果一种类型需要它们而不是其他类型,那么可能需要一些丑陋的逻辑来验证。
问题3:如果我应该编程到一个接口而不是一个具体的类(OO原则再次)将如何工作,因为如果我有类似ICar的东西,由具体的类汽车实现,把东西送到ICar不管用。像List< ICar>不会给我所有正确的数据。同时对接口ICAR实现MVC视图也很困难。
你不是假设要编程接口,你应该选择完全依赖于实现的接口/基类。我在你的例子中说,只需使用一个基类(像VehicleBase
这样你可以将所有共享属性放在其中。
答案 2 :(得分:0)
是的,他们应该在不同的班级。模型中的实体shoudnt具有逻辑上不“属于”它们的属性。在处理Truck
时,设置或阅读PassangerCapacity
很可能没有意义。这只会令人困惑。
这是在ORM层中做出的选择(在您的情况下为EF)。 EF支持单个表,其中包含所有子类的属性列,以及子类的多个表。两种选择都有其优点。单个表具有较少的连接,因此它可能更快,但是几个表减少了数据库必须存储,读取和写入的列数,因此在存储时它可能更有效。这一切也取决于实际数据集的外观。然而,这将由ORM层(EF)抽象,因此在您的对象模型中它们应该仍然是分开的。
如果您的代码需要处理卡车,您应该让它处理卡车,对于只关心汽车的地方,请使用ICar。您的数据库层可以公开汽车,卡车和赛车的数据集。