java - 域对象中的业务逻辑

标签 java performance design-patterns concurrency

有这门课:

public class DataPeriod {

private final String key;
private final LocalDate from;
private final LocalDate to;

private final Map<LocalDate, DataPoint> dataPoints = new HashMap<LocalDate, DataPoint>();

public DataPeriod(String key, LocalDate from, LocalDate to) {
    this.key = key;
    this.from = from;
    this.to = to;
}

public LocalDate getFrom() {
    return from;
}

public LocalDate getTo() {
    return to;
}

public void hit(int id) {
    DataPoint dataPoint = getOrCreate();
    dataPoint.hit(id);
}

private DataPoint getOrCreate() {
    LocalDate now = LocalDate.now();
    String dataPointKey = key + now.toString();
    if ( !dataPoints.containsKey(now) ) {
        DataPoint dataPoint = new DataPoint(dataPointKey);
        dataPoints.put(now, dataPoint);
    }

    return dataPoints.get(dataPointKey);
}

public long count() {
    long count = 0l;
    for (DataPoint dataPoint : dataPoints.values()) {
        count += dataPoint.count();
    }
    return count;
}

将方法hit(int id)getOrCreate() 提取到其他一些类作为服务或助手可能是个好主意。但随后应修改它们以接收 DataPoint 的参数。

我认为将它们包含到 DataPoint 类中是有意义的,因为它们代表 DataPeriod 必须知道的操作。

那个场景有某种模式吗?在并发方面提取或不提取这些方法有什么区别?

最佳答案

我认为如果这些方法仅使用同一类中的数据,或者换句话说,如果它们不依赖于其他类,则最好将它们留在同一模型类中。

当然你永远不会从一个模型类访问服务,但有时很难决定一个模型类是否应该使用另一个模型类。这取决于关系是否紧密(例如,一个包含另一个,并且包含的​​类永远不会被独立使用)。如果两个模型类不是强相关的,那么一个不应该管理另一个;在那种情况下,我会将工作留给第三个外部类(例如服务或只是另一个模型类包含其他类)。

在您的情况下,DataPeriod 包含 dataPoints(可能是另一个模型类),所以我认为将方法留在那里没问题。

关于java - 域对象中的业务逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30560837/

相关文章:

java - 哪种方法更适合查找数组列表中元素的频率?

java - 让敌人以相同的速度沿着路径走

java - 两次获得完全相同的对象引用的机会有多大

java - 如何在java中检查数组

java - 如何从不同的计算机连接到 MySQL 数据库?

具有日期范围和时间步长的 MySQL 查询性能

MySQL - 选择表中的相关项目

c++ - 特征类、命名空间和前向声明

java - builder 模式中的逻辑

java - 命令模式与反射