2014-12-02 68 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