我创建了一个名为DrivingLog的聚合类。我只在下面的图片中包含了necassary字段。
现在,当我想添加一个驾驶记录时,我在addRecord(Double distance, ...)
对象上说DrivingLog
。但是,DrivingRecord是Condition
和Environment
类的聚合还是只是引用?条件和环境在DrivingRecord
之外没有任何价值。
条件和环境是静态数据:用户将在JSF视图的下拉列表中选择预定义值。但是如果DrivingRecord
是一个聚合,它应该有一个名为addEnviroment()
的方法。这应该以{{1}}类作为参数吗?
如果是这样,Enviroment
会有一个名为DrivingLog
的方法吗?
最后,环境和条件不应被聚合根“隐藏”,也不应在外部访问。这让我想一想,如果DrivingRecord确实是一个聚合的根。
聚合的嵌套是否允许,不良做法,在某些情况下是否正常?
答案 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确实是一个聚合的根。
确定
聚合的嵌套是否允许,不良做法,在某些情况下是否正常?
对项目目标了解甚少,我无法判断是否有更好的架构。但这当然不是一种糟糕的做法。