我做了一个聚合类,名为DrivingLog。我仅在下面的图片中包含了必要的字段。
现在,当我想添加行车记录时,在addRecord(Double distance, ...)
对象上说DrivingLog
。但是,DrivingRecord是Condition
和Environment
类的汇总还是仅引用?条件和环境没有任何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是否确实也是聚合根。
当然
是否允许嵌套聚合,这是坏习惯,在某些情况下还可以吗?
对您的项目目标知之甚少,我无法判断是否有更好的架构。但这当然不是一个坏习惯。