我正在尝试确定解决以下问题的最佳方法:
我有一个名为Desk的课程。办公桌拥有许多物业。桌面上可能有一些物体。当前的应用程序指定它可以在桌面上放置铅笔,计算机或杯子。将来可能会添加更多对象。它可以有一个或没有每个对象。铅笔具有Color属性,所有对象都有ID和名称。所有这些信息必须是持久的,因此以某种形式存储在数据库中。
我:
public class Desk {
public int property1;
public int property2;
...
public ISet<DeskObject> deskObjects;
}
public DeskObject {
public int deskObjectID;
public String name;
public DeskObject(name) {
this.name = name;
}
}
public Computer extends DeskObject {
DeskObject("Computer");
}
public Pencil extends DeskObject {
DeskObject("Pencil);
public Color color;
}
我还需要在O(1)时间内轻松告知Desk包含哪些对象。这意味着我将不得不为DeskObjects重写hashcode和equals(可能只是返回ID),所以我可以做set.contains(object)。这似乎有点过分和滥用对象。当然有更好的解决方案吗?
答案 0 :(得分:1)
如果你的域是关于办公桌及其包含的对象,那么这样的对象模型是完全合理的。您需要问自己的唯一问题是:这是我的域模型,还是计算模型?
从你的问题的措词来看,我推断它而不是后者。您的对象不包含任何行为(例如Desk.CleanNonRecentlyUsed())。
域模型包含数据和行为(真正的对象模型,我称之为域模型),计算模型是数据和分离行为(程序代码)。
如果您的模型需要做的只是提供有效的查找,您可以选择任何适合您的抽象表示。一个只捕获数据的轻量级对象是可以的,但你也可以使用元组(或者因为你提到了GetHashCode:Annonymous类而是.net特定的)或者只是桌面的Hashtable。您的计算模型可以是数据库中的索引(在您的示例中听起来合理),特殊对象模型或普通数组上的专用算法。
大多数情况下,当您已经拥有域模型时,不保证创建计算模型。但有时它是。