当一对一关系应该存储在对象或专用存储中时?

时间:2012-08-18 21:42:54

标签: oop

假设我们有一个类Car,其中MAIN字段称为VIN(车辆识别号)。 VIN为我们提供了很多信息:

  • 所有者
  • 注册地
  • 生产国
  • 生产年份
  • 颜色
  • 引擎类型
  • 等。等

我可以继续并添加更多信息:

  • 最后已知的GPS坐标
  • 罚单
  • 是盗窃(布尔)
  • 等。等

Car对象中存储一些信息(例如生产年份和引擎类型)似乎是合理的。但是,将所有这些信息存储在Car对象中会使其过于复杂,“过载”并且难以管理。此外,随着应用程序的发展,我可以添加越来越多的信息。

边境在哪里?应该在Car对象中存储什么以及应该存储在Dictionary<Car, GPSCoordinates>

之类的内容

我认为可能我应该在Car对象中存储“静态”数据,以便将其设为immutable。并将“动态”数据存储在特殊存储中。

2 个答案:

答案 0 :(得分:0)

仅仅因为您的Car班级提供属性 GPSCoordinates并不意味着您需要在内部保留这些坐标。从本质上讲,这就是封装的全部内容。

是的,您可以添加“IsInGarageNow”,“WasEverDrivedByMadonna”或“RecommendedOil”等属性。

答案 1 :(得分:0)

我会使用一个名为CarModel的类来表示应用程序中每个可能的汽车共享的基本属性(引擎大小,颜色,注册号等)。然后,您可以使用任何数量的更具体的子类(如Car,RentalCar或任何适合您业务逻辑的子类)扩展此类。

通过这种方式,您可以清楚地定义所有汽车共享的内容以及不同州汽车的其他定义(例如,RentalCar及其独特参数)。

<强>更新

我猜你正在寻找的东西是这样的(虽然我建议反对它):

public class Car
{
   // mandatory
   protected int engineSize;
   protected int color;

   // optional
   protected Map<String, Object> attributes = new HashMap<String, Object>();


   public void set(String name, Object value)
   {
     attributes.put(name, value);
   }

   public Object get(String name)
   {
     return attributes.get(name);
   }
}

为什么这不是一个好的解决方案:

  • 祝你好好将这个类保存到数据库中,或者设计任何依赖于众所周知的属性的东西。
  • 调试潜在问题的梦魇。
  • 在类型定义方面不是很好地使用OOP。这可能会被滥用来将Car类变成不属于它的东西。