使用嵌套聚合对象

时间:2012-02-17 20:26:32

标签: java java-ee domain-driven-design

我创建了一个名为DrivingLog的聚合类。我只在下面的图片中包含了necassary字段。

现在,当我想添加一个驾驶记录时,我在addRecord(Double distance, ...)对象上说DrivingLog。但是,DrivingRecord是ConditionEnvironment类的聚合还是只是引用?条件和环境在DrivingRecord之外没有任何价值。

条件和环境是静态数据:用户将在JSF视图的下拉列表中选择预定义值。但是如果DrivingRecord是一个聚合,它应该有一个名为addEnviroment()的方法。这应该以{{1​​}}类作为参数吗?

如果是这样,Enviroment会有一个名为DrivingLog的方法吗?

最后,环境和条件不应被聚合根“隐藏”,也不应在外部访问。这让我想一想,如果DrivingRecord确实是一个聚合的根。

聚合的嵌套是否允许,不良做法,在某些情况下是否正常?

enter image description here

1 个答案:

答案 0 :(得分:1)

  

当我想添加驾驶记录时,我说addRecord(双倍距离......)

我建议使用addRecord(DrivingRecord record)作为您服务的API。

  

是DrivingRecord是Condition和Environment类的聚合,还是仅引用?条件和环境在DrivingRecord之外没有任何价值。

我不确定我是否按照您的意思使用术语,但我认为两个答案都是正确的 - DrivingRecord是一个聚合(我想“指向一堆对象”),但也是一个引用(作为任何对象) Java中的“handel”被认为是参考文献。 关键是 - 它不是作为blob传递的,而是作为堆内存的4字节引用,如果你用“new XYZ”(或堆栈,如果它是作为参数传递给方法的基元)实例化的话。只要它被生物体引用,它就不会被垃圾收集。

  

条件和环境是静态数据:用户将在JSF视图的下拉列表中选择预定义值。但是如果DrivingRecord是一个聚合,它应该有一个名为addEnviroment()的方法。这应该以Enviroment类为参数吗?

在构造DrivingRecord实例后,您需要允许插入对List的引用。

  

如果是这样的情况,那么DrivingLog会有一个名为addRecord的方法(双距离,环境环境......)?

我不知道这些参数是否相互关联,但它们可以单独添加,我建议这样:

class DrivingRecord {
   private ArrayList<Enviroment> env;
   private ArrayList<Condition> cond;
   private Double distance;
   addEnvironment(Enviroment e) { env.add(e); }
   addCondition(Condition c) { cond.add(c); }
   setDistance(Double d) { distance=d;}
}
  

最后,环境和条件不应被聚合根“隐藏”,也不应在外部访问。这让我想一想,如果DrivingRecord确实是一个聚合的根。

确定

  

聚合的嵌套是否允许,不良做法,在某些情况下是否正常?

对项目目标了解甚少,我无法判断是否有更好的架构。但这当然不是一种糟糕的做法。