【问题标题】:Can't figure out what's wrong with my domain object design无法弄清楚我的域对象设计有什么问题
【发布时间】:2023-04-09 21:49:02
【问题描述】:

我有这两个班,有人告诉我我做错了。

class Employee {
private int employeeID;
private String employeeName;
private Seat employeeSeat;
}

这是针对与 Seat 类有关系的员工类

class Seat {
private int seatID;
private String seatCode;
private Employee occupant;
}

我还为我的座位添加了一个员工属性,因为当我检索座位时,我想确定谁是座位的当前占用者。我的员工也是如此,当我检索它时,我想确定员工的当前座位。现在,他们说因为员工有座位属性,而座位有员工属性,这是一个糟糕的设计。

【问题讨论】:

    标签: java class oop domain-driven-design domain-object


    【解决方案1】:

    您必须请告诉您错误的人详细解释他们的意思。它可能是也可能不是,但这将取决于整个系统架构和在对象之间导航的要求。

    他们的意思可能是你应该有一个EmployeeSeat 对象来保存关系以及与该关系有关的任何细节(开始日期、结束日期、小时等)。但是您必须担心其他问题,例如强制基数约束(员工可以有多个席位,反之亦然)?

    【讨论】:

    • 我想这或多或少是他的意思,但如果我这样做,我的问题是,如果我向我的员工类添加另一个属性项目,该属性引用像员工座位这样的项目类,我想要将员工连同他们的项目和座位一起展示,这就成了一个问题。
    • 这不是“问题”,而是复杂性和需求之间的“权衡”。简而言之,这就是软件工程的意义所在。您必须不断做出现实世界的权衡。这就是为什么设计很难,而且这不是你在学校学到的东西(除非你有一些出色的教授)。
    • 所以我想知道是否必须创建一个类来将 Seat 和 Project 链接到 Employee 之类的 EmployeeSeatProject 或其他东西,还是将其作为属性放在员工类中更好。跨度>
    • “SeatAssignment”可能更符​​合无处不在的语言。
    【解决方案2】:

    因为在运行时更新关系的一侧以指向另一个实体并忘记更新另一侧(使模型处于不一致状态)的风险通常被认为比使用一个实体的轻微不便更糟糕-方向关联。但这并不总是可能的。

    【讨论】:

    • 不只是打破聚合边界以在另一个 AR 中引用一个 AR?
    • 也可以,但 OP 没有提到聚合。如果我没记错的话,Evans 在蓝皮书中谈到了实体之间的双向关联,无论聚合如何。
    • 是的,但那是在仍然建议利用域模型生成查询的时代。这基本上是您需要在另一个 AR 中引用 AR 的唯一原因。
    • 但我们也可以谈论在同一个聚合中相互引用的两个实体;)
    猜你喜欢
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    相关资源
    最近更新 更多