2011-06-29 50 views
4

我正在尝试确定以下问题的最佳方法:只有两个属性的对象

我有一个名为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)时间。这意味着我将不得不重写hashcode和等于(可能通过返回ID)DeskObjects,所以我可以做set.contains(object)。这似乎是矫枉过正和滥用对象。当然有更好的解决方案?

+0

如果我理解你的Q,当你需要比较2个对象时,使用重写'Equals'和反过来'Hashcode',是吗? –

+0

啊,是的,例如,我可以判断书桌是否有铅笔。 – BobTurbo

回答

1

如果您的域是关于桌面及其包含的对象,那么像这样的对象模型是完全有保证的。您需要问自己的唯一问题是:这是我的领域模型,还是计算模型?

从你的问题的措辞,我会推断它的后者。您的对象不包含任何行为(如Desk.CleanNonRecentlyUsed())。一个域模型包含数据和行为(一个真正的对象模型,我称之为域模型),一个计算模型是数据和分离行为(过程代码)。

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

大多数情况下,当您已经拥有一个域模型时,不需要创建计算模型。但有时候是这样。

+0

不,它们不包含任何行为,但这是因为它是使用MVC方法和ORM的Web应用程序。没有太多的对象包含方法:) DeskObjects是模型层的一部分,但它们是非常薄弱和简单的对象。 – BobTurbo

+0

我会补充说,网页会在桌面上显示对象。 – BobTurbo

+0

我不会为此感到难过。它看起来像一个非常合理的要求。如果您的ORM将您试图找到的铅笔映射到桌面已脱水的铅笔所在的同一对象,则无需重写equals/gethashcode。 –

相关问题