我做了一个聚合类,名为DrivingLog。我仅在下面的图片中包含了必要的字段。

现在,当我想添加行车记录时,在addRecord(Double distance, ...)对象上说DrivingLog。但是,DrivingRecord是ConditionEnvironment类的汇总还是仅引用?条件和环境没有任何DrivingRecord以外的值。

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

如果是这样,DrivingLog是否会有一个名为addRecord(Double distance, Environment environment...)的方法?

最后,环境和条件不应被聚合根“隐藏”,并且永远不要在外部访问。这让我想到了DrivingRecord是否确实也是聚合根。

是否允许嵌套聚合,这是坏习惯,在某些情况下还可以吗?

最佳答案

当我想添加行车记录时,我说addRecord(Double distance,...)


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


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


我不确定我是否按照您的意思遵循术语,但是我认为两个答案都是正确的-DrivingRecord是一个聚合(我想“指向一堆对象”),而且还是一个引用(就像任何对象“ handel”一样)在Java中被视为参考)。
关键是-它不是作为blob传递的,而是通过“ new XYZ”实例化为堆内存的4字节引用(如果是作为参数传递给方法的原语,则为堆栈)。只要活动对象引用它,它就不会被垃圾收集。


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


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


  如果是这样,DrivingLog是否有一个名为addRecord(Double distance,Environment environment ...)的方法?


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

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是否确实也是聚合根。


当然


  是否允许嵌套聚合,这是坏习惯,在某些情况下还可以吗?


对您的项目目标知之甚少,我无法判断是否有更好的架构。但这当然不是一个坏习惯。

10-06 01:39