2014-12-02 61 views
-2

假設我們有一個Entity:Person,並且Person中有一個名爲Education的域。 在用戶界面中,教育屬性是一個下拉列表,用戶只能從給定選項中選取一個選項。這些選項可以由管理員從系統中的某個地方添加。OO設計實體的期權價值

我的問題是,在面向對象的設計時,應實地教育類型:

  1. A類稱爲教育延伸的GeneralOption,在這個 方式,我們得到了類型安全,但每次新選項字段已添加 ,我們需要添加一個新的類。
  2. 只使用GeneralOption,這樣,錯誤類型的值可以傳遞給 Person.setEducation()

這是建模的比較正確的做法,是類型安全的值得嗎?

+0

爲什麼標記爲* java * **和** * c#* **和** * C++ *? – 2014-12-02 13:13:31

+0

@MatiCicero它不應該。我重新刪除了標籤。 – Borgleader 2014-12-02 13:15:46

+0

@MatiCicero你是對的,在這裏很抱歉。 – 2014-12-02 13:24:14

回答

1

這取決於關於特定的任務和類的用法。如果你的設計只是關於用戶界面,這些類是ViewModelsGeneralOption可以工作。如果您懷疑子實體將來可以擴展,或者您需要包含其他數據(如每個子實體的顏色或教育級別等),則可以引入新類。

0

如果你想保持它作爲一個簡單的指標,我會去enum。在C#中,它們非常適合這種徵募數據。

[Flags] 
public enum EducationEnum 
{ 
    Elementary = 1, 
    BSc = 2, 
    Master = 4, 
    Phd = 8, 
    Other = 16, 
} 

所以,你必須:

public class Person 
{ 
    public EducationEnum Education { get; set; } 
} 

並且你使用如下:

Person p = new Person(); 
p.Education = EducationEnum.Phd; 

而且在代碼中您可以使用標準ifswitch語句檢查教育。

此外,您還可以進行按位運算,並結合幾個值的教育(這就是爲什麼數是2的冪和[標記]屬性添加),例如:

p.Eduction = EducationEnum.Elementary | EducationEnum.Other; 
+0

使用枚舉的問題是,選項將在未來由管理員更新,可能會添加一些新選項 – 2014-12-02 13:26:48

+0

處理該問題的一種方法是在使用字段的值並創建時使用'switch'語句每個現有選項的案例。然後在'default'部分,你可以拋出一個'ArgumentException'。通過這種方式,您可以確保您不會無聲地處理更改(並且可能不正確)。 – PiotrWolkowski 2014-12-02 13:44:48

+0

該選項無法動態添加(在管理頁面更新) – 2014-12-03 04:24:51