如何最好地定义聚合关系?

Posted

技术标签:

【中文标题】如何最好地定义聚合关系?【英文标题】:how to best define aggregation relation? 【发布时间】:2011-09-16 13:21:24 【问题描述】:

抱歉,我找不到更好的问题格式。

我有两个课程(设计,颜色)

设计类可以有多种颜色,并且对于每种颜色,设计可以指定一些属性,例如为(Design-Color)的组合命名。

然后我有一个 Fabric 类,它有一个 Design-Color 组合。

在这些类之间实现这种关系的适当方法是什么?

这是一个建议的模型(我认为这是错误的):

class Design 
   public string Name  get;set;

   public int StringNumber get;set;

///some other properties.


class Color 
   public string Name  get;set;

///some other properties.


class ColoredDesign 
public Color Color  get;set;

public Design Design  get;set;

public string ColoredDesignName  get;set;

public string WashingWay  get;set;


class Fabric 
public ColoredDesign   get;set;

public float Length  get;set;

设计和颜色之间存在缺失关系,它指定了单一设计的可能颜色。

申请是针对面料工厂的,

首先,他们定义设计及其颜色,并定义指定设计中的每种颜色可以在称为洗涤方式的属性中制备的方式,以及每种设计中每种颜色独有的许多其他属性。

所以每个面料都必须说明它属于什么颜色和设计。

例如:假设我有一个名为 (A) 的设计 它有以下颜色:

红色:ColoredDesignName:(A-RD),洗涤方式:W1 绿色:ColoredDesignName:(A-GN)洗涤方式:W2 蓝色:ColoredDesignName:(A-BL)洗涤方式:W3

然后我可以拥有一个 (A-RD) 长度为 100M 的 Fabric。

和另一种 (A-BL) 和 200 M 长度的织物。

【问题讨论】:

我错过了什么吗?问题不清楚吗? 【参考方案1】:

回答您的问题并不容易,因为缺少与经常推动设计的业务需求相关的部分。我从事 DDD 已有几年了,在制作模型时对我有很大帮助的是商业语言(翻译为 UL)和我应该考虑的要求。

我不确定您是否担心 DDD,但从您的问题来看,我可以说您进展顺利。对我来说,设计和颜色之间的关系可以是有效的 ColoredDesign 或 ColouredDesign 抽象。设计和颜色只是你组成另一个对你的模型很重要的抽象的一部分。因此,您的 Fabric 类是您介绍的非常好的东西。它可能包含创建 ColouredDesign 对象的逻辑,包含关于它应该如何构造的约束等等。那么客户端不关心创建逻辑,也不与它所消费的对象的创建约束耦合。

所以从我在你的问题中可以读到的几个细节中,我认为这是一个可行的设计。也许其他人对此有不同的看法。

【讨论】:

【参考方案2】:

我建议你在Design 类中创建一个属性public Color[] AvailableColorsget;set; 来表达某些颜色的设计可用性。然后在Fabric 中,您可能有两个属性用于设计和颜色,如果织物颜色是设计可用颜色之一,请检查业务逻辑。我建议您删除 ColoredDesign 类,因为如果没有 Fabric,IMO 设计和颜色之间的真正联系就没有任何意义。如果出于任何原因您坚持使用ColoredDesign 类,您应该检查ColoredDesign 的颜色,而不是我之前提到的Fabric 的颜色。如果您保留ColoredDesign,它将如下:

【讨论】:

其实Design和Color之间的关系是有含义的,并且包含了很多没有提到的属性,但可能我没有解释清楚。我将编辑问题以添加更多详细信息。 我忘了说不仅你必须指定可用的颜色,而且你还必须指定一些关于每种颜色与设计的联系方式的更多细节(如洗涤方式、机器可以安装组合的,组合每1M的重量....等 @Nour 洗涤方式是否仅取决于颜色或设计?机器选择如何,取决于颜色,设计和洗涤方式?还有同样的问题,关于每 1m 的重量,它取决于什么组合? 它们都依赖于颜色和设计。所以红色可以有一个设计的洗涤类型和另一个不同设计的洗涤类型,同样适用于机器和重量。 @Nour 如果它们都依赖于颜色和设计,那么将它们全部放在 ColoredDesign 类中,但将其命名为更有意义的名称以反映其新角色。

以上是关于如何最好地定义聚合关系?的主要内容,如果未能解决你的问题,请参考以下文章

对象关系之聚合关系

如何最好地链接到 Laravel 中的多态关系

如何理解UML中类似于自反关联的“自反聚合”关系

java 聚合和组合的区别?

举例简要说明啥是聚合关系,掌握聚合关系具有啥样的意义

领域驱动设计:如何设计具有依赖关系的关系聚合