MVC 4 中的 OO 设计/实现
本文关键字:实现 设计 OO 中的 MVC | 更新日期: 2023-09-27 18:33:44
我有一个OO设计/数据库问题。我正在使用实体框架 4 在 MVC v4 中编码Microsoft 5。假设模型如下:
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;}
}
在稍后阶段,我可能想要扩展模型,因此必须考虑这一点。 例如:添加一辆具有"涡轮数量"属性的赛车。
遵循良好的OO设计原则:
问题1:这些应该都在单独的类中还是全部与修饰符合二为一。从OO方面来看原则分离,我会说分裂它们。封闭/开放原则也规定它们应该被拆分,这将在我稍后添加赛车时有所帮助,而不必更改公共汽车、卡车等的任何内容。
问题2:它们应该都在同一个数据库表中吗?尽管我不认为类的数量应该决定表的数量,但我仍然会选择单独的表,以便数据库规范化并且到处都没有未使用的字段。默认情况下,代码优先将其全部放在一个表中,但我已将其与类架构属性分开。
问题3:如果我应该编程到接口而不是具体类(再次是 OO 原则(,这将如何工作,因为如果我有类似 ICar 的东西由具体类汽车实现,将东西转换为 ICar 将不起作用。像 List
我甚至应该将接口放在仅属性类上吗?我应该在这里使用存储库或其他模式/想法之类的东西吗?
对于这个长问题,我深表歉意,我感谢任何帮助。提前谢谢。Mike
问题 1:这些应该都在单独的类中还是全部与修饰符合二为一。从OO方面来看原则分离,我会说分裂它们。封闭/开放原则也规定它们应该被拆分,这将在我稍后添加赛车时有所帮助,而不必更改公共汽车、卡车等的任何内容。
实际上将类分开,每个项目类型一个类。这也将是未来的证明,因为您对任何类所做的任何更改不一定会影响其他类。将来将共享的任何添加的内容都可以存在于基类上。
问题 2:它们应该都在同一个数据库表中吗?尽管我不认为类的数量应该决定表的数量,但我仍然会选择单独的表,以便数据库规范化并且到处都没有未使用的字段。默认情况下,代码优先将其全部放在一个表中,但我已将其与类架构属性分开。
不,绝对不是。是的,查询会更容易,但您查询的数据量实际上会增加。此外,您正在有效地对数据库设计进行非规范化,更不用说具有大量可为空的字段,如果一种类型不需要这些字段,而其他类型不需要这些字段,则可能涉及一些丑陋的逻辑来验证。
问题 3:如果我应该对接口而不是具体类(再次是 OO 原则(进行编程,这将如何工作,因为如果我有类似 ICar 的东西由具体类汽车实现,将东西转换为 ICar 将不起作用。像 List
这样的东西不会给我所有正确的数据。此外,在接口 ICAR 上实现 MVC 视图也将很困难。
您不应该对接口进行编程,您应该选择一个完全依赖于实现的接口/基类。我想说的是,在您的示例中,只需使用一个基类(类似于VehicleBase
,您可以将所有共享属性放入其中。
-
是的,他们应该在不同的班级。模型中的实体具有在逻辑上不属于它们的属性。在处理
Truck
时,设置或读取PassangerCapacity
很可能没有意义。这只会令人困惑。 -
这是在 ORM 层(在您的情况下为 EF(中做出的选择。EF 支持单个表,其中包含所有子类的属性列,以及子类的多个表。这两种选择都有其优点。单个表的连接较少,因此可能更快,但多个表减少了数据库必须存储、读取和写入的列数,因此在存储方面可能更有效率。这也取决于实际数据集的外观。但是,这将由 ORM 层 (EF( 抽象,因此在您的对象模型中,它们仍应是分开的。
-
如果你的代码需要处理卡车,你应该让它处理卡车,对于它只关心汽车的地方,使用 ICar。 您的数据库层可以公开包含汽车、卡车和赛车的数据集。
答案 1:
是的,这些应该分为多个类。 您可以通过将Car
标记为抽象来进一步扩展它,因为它是其他类型的汽车的基类。您还必须将属性标记为抽象,如下所示:
abstract class Car
{
abstract public int Id;
}
尽管更好的名称可能是 Vehicle
.
答案 2:
您可以将这些存储在一个称为Vehicle
的表中,并具有一个VehicleType
表。
表车辆:
ID 车辆名称 车辆类型
1丰田 1
2川崎 2
表车辆类型:
身份证车辆说明
1 汽车
2 摩托车
3 卡车
答案 3:
如果您使用了一个接口并有一个列表,您将被限制为ICar
接口公开的属性/字段。 但是,您可以将其转换为适当的车辆类型。