仅具有两个属性的对象

时间:2011-06-29 12:01:28

标签: oop

我正在尝试确定解决以下问题的最佳方法:

我有一个名为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)。这似乎有点过分和滥用对象。当然有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

如果你的域是关于办公桌及其包含的对象,那么这样的对象模型是完全合理的。您需要问自己的唯一问题是:这是我的域模型,还是计算模型?

从你的问题的措词来看,我推断它而不是后者。您的对象不包含任何行为(例如Desk.CleanNonRecentlyUsed())。

域模型包含数据和行为(真正的对象模型,我称之为域模型),计算模型是数据和分离行为(程序代码)。

如果您的模型需要做的只是提供有效的查找,您可以选择任何适合您的抽象表示。一个只捕获数据的轻量级对象是可以的,但你也可以使用元组(或者因为你提到了GetHashCode:Annonymous类而是.net特定的)或者只是桌面的Hashtable。您的计算模型可以是数据库中的索引(在您的示例中听起来合理),特殊对象模型或普通数组上的专用算法。

大多数情况下,当您已经拥有域模型时,不保证创建计算模型。但有时它是。