在我的域中建模真/假属性的正确方法是什么?

时间:2011-08-24 16:49:43

标签: domain-driven-design

想象一下,我有一个实体的域名,此实体的一个属性是 true / false 属性,例如 Active / Inactive

对此进行建模的正确方法是什么?

  1. 使用布尔值? False =无效 True =有效
  2. 使用枚举:

    公共枚举状态  {      有效= 1,      无效= 2  }

  3. 我认为使用枚举是正确的方法,但使用布尔属性我也看到没错。

    你们DDD的人对此有何看法?

3 个答案:

答案 0 :(得分:1)

如果它是真/假对,那么布尔值就好了恕我直言。无需过度复杂化。

如果该值被用作方法参数,则枚举或偶数类可能更好以提高可读性。但话说回来,你可以考虑改用两种不同的方法。

枚举可能存在的问题是,人们可能会使用无效值。这可以通过使用这样的类来减轻:

public class ActivityState {
    public static ActivityState Active = new ActivityState();
    public static ActivityState Inactive = new ActivityState();
}

...

// in your entity:

public ActivityState IsActive { get; set; }

this.IsActive = ActivityState.Active; // or
this.IsActive = ActivityState.Inactive;

它可以像枚举一样使用,但要确保不允许使用无效值。

答案 1 :(得分:1)

我想说Enums只针对这些情况,以避免将概念与原始类型或类映射。

例如,避免使用布尔值映射2值逻辑,或者使用整数1,2,3来更多值(如信号量的颜色:红色,绿色,黄色)。

Enums只是为了避免这种情况,并明确其中的每一个含义,提高易读性和可维护性,以及类型安全(你可以限制一个方法只接收你的枚举类型,而不是更广泛的布尔类型,这使你的代码更安全。)

答案 2 :(得分:0)

需要状态机时使用枚举。
恩欧姆说,旗帜是相互排斥的,密切相关。

E.g。 - 如果我们在RPG游戏中有一个Warrior类,它可以有“Alive”或“Dead”状态。那些不能同时是真实的。因此 - 在这里使用枚举是有意义的。

相比之下:战士可以战斗/跑步/喝酒/说话/吃饭/睡觉。在这里我们不能使用enum,因为那些并不是相互排斥的(Warrior应该能够在挥动剑和吃三明治的同时绕圈跑。)