【问题标题】:What's the correct way to model a true/false property in my domain?在我的域中为真/假属性建模的正确方法是什么?
【发布时间】:2011-08-24 16:49:42
【问题描述】:

假设我有一个具有 Entity 的域,并且该实体的属性之一是 true/false 属性,例如 Active/Inactive .

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

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

    公共枚举状态 { 活跃 = 1, 非活动 = 2 }

我认为使用 Enum 是正确的方法,但使用 Boolean 属性我也看到并没有错。

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

【问题讨论】:

  • Entity.isActive() 不行吗?
  • @Rekin 不,因为我使用的是实体框架,所以我需要公开这个属性。

标签: domain-driven-design


【解决方案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;

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

【讨论】:

    【解决方案2】:

    我会说枚举仅用于这些情况,以避免将概念映射到原始类型或类。

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

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

    【讨论】:

      【解决方案3】:

      在需要状态机时使用枚举。
      Enum 表示标志是相互排斥且密切相关的。

      例如- 如果我们在 RPG 游戏中有一个战士职业,它可以有“活着”或“死去”的状态。这些不可能同时是真实的。因此 - 在这里使用枚举是有意义的。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-06
        • 2018-07-01
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多