2013-02-20 51 views
1

我想弄清楚設置此模型的最佳方法。我幾乎做到了這一點,但我正在考慮以另一種方式來做。這是一次學習經歷,所以浪費時間並不重要。對象模型,正確或最直觀的方法

namespace FirstWay 
{ 

public class CrateOfBags 
{ 
    public string crateId { get; set; } 
    public string originCountry { get; set; } 
    public List<BagOfApples> bagList { get; set; } 
} 

public class BagOfApples 
{ 
    public double weight { get; set; } 
    public string bagId { get; set; } 
    public List<apple> appleList { get; set; } 
} 

public class apple 
{ 
    public string appleId { get; set; } 
    public string color { get; set; } 
    public Boolean rotten { get; set; } 
} 
} 

//或者這

namespace SecondWay 
    { 
public class CrateOfBags 
{ 
    public string crateId { get; set; } 
    public string originCountry { get; set; } 
} 

public class BagOfApples : CrateOfBags 
{ 
    public string bagId { get; set; } 
    public double weight { get; set; } 
} 

public class apple : BagOfApples 
{ 
    public string appleId {get;set;} 
    public string color { get; set; } 
} 

}

可能的問題

蘋果的問題: 多少爛蘋果交付? 哪個袋子和/或哪些箱子爛蘋果來自? 第一種方式:可以循環通過每個箱子,然後袋子,然後蘋果和計數。 第二種方式:只能通過蘋果循環,並將父項屬性添加到HashSet(一種避免重複的方法)

箱子問題。查找每個國家的箱子數量? 第一種方式:循環通過箱子,並保持一個計數列表,數組,不管。第二種方式:將不得不遍歷所有蘋果,只關心箱子。

我碰到的一個問題是我對蘋果作爲自己的實體知之甚少。我只知道它是從哪個箱子開始從板條箱的foreach循環

但是如果我想問一個問題,例如「有多少青蘋果在特定的批次中(通過ID)?」我也有問題取決於方式。

對我來說,說一個蘋果是一個袋子的孩子似乎很尷尬,就像一隻狗是動物的孩子。不過,我喜歡能夠自由移動操作蘋果的想法,比如只需通過更改父屬性bagid即可切換哪些包。我並不是在尋找特定問題的解決方案,只要其中一個更好(更靈活,更高效,更直觀),另一個更好,或者我完全錯過某些東西,比如使用其他技術。非常感謝。

P.S.這不是真正的模型,而是一個相當不錯的代表。

回答

5

從數據建模的角度來看,第二種方法顯然是錯誤的:一個蘋果不是 a BagOfApples。繼承應該創造可替代性:你是否可以在總是把蘋果放在BagOfApples的位置?我不這麼認爲。這是Liskov替代原則(它被違反了)。

在數據庫方面,第二個模型是非規範化的。它可以從第一個模型創建,將所有3個表連接在一起,從而創建冗餘數據。這是一種反模式,因爲當您更改某些內容時,必須在多個位置進行更改(如果您忘記它是無聲數據損壞)。

+0

好的,謝謝。第一種方式看起來好嗎,還是有其他更好的方法?我對這條路線不滿意,因爲蘋果本身應該知道它的來源(如國家或批次)。例如,如果我想將蘋果放在一個大的儲存容器中乾燥,我應該能夠測量「乾燥速率「然後仍然找到原籍國。 – TheBigC 2013-02-20 23:04:54

+0

你可以通過給蘋果一個BagOfApples的引用來解決這個問題。你的3個班級是一個有三個級別的樹,你想要的是父母使用列表鏈接到孩子,並使用對象引用鏈接到父母的孩子。這使得樹可以在任何方向上導航。不過,您必須小心保持鏈接的同步。 – usr 2013-02-20 23:46:33

3

似乎笨拙對我說,蘋果是一個袋子

神的孩子,因爲這是錯誤的。一個蘋果不是一包,因此不應該從它繼承。

您的第一個模型看起來不錯。我會考慮的唯一建議是一般化Bag,因此它可以被重新利用:

public class CrateOfBags<T> 
{ 
    public string crateId { get; set; } 
    public string originCountry { get; set; } 
    public List<Bag<T> bagList { get; set; } 
} 

public class Bag<T> 
{ 
    public double weight { get; set; } 
    public string bagId { get; set; } 
    public List<T> ItemList { get; set; } 
} 

public class apple 
{ 
    public string appleId { get; set; } 
    public string color { get; set; } 
    public Boolean rotten { get; set; } 
} 

我還不是很瞭解蘋果作爲自己的實體。我只知道從箱子開始的foreach循環是從哪個箱子開始的。

這是通過使用反向引用解決的,這意味着蘋果有一個引用它的包,它有一個引用它的創建。然而,這並不總是有意義的,特別是如果有多種容器類型可能包含Apple或者蘋果公司不應該知道它的包裝。

相關問題