2011-06-29 54 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。 –

相關問題