贫血领域对象?

3
在我的系统中,用户可以发布任意数量的旅行计划。我的User类(领域对象)如下所示:
public class User {
    private String name;
    private String id;
    /* More private fields */

    /* getters and setters */
}

所以如果我想获取id为1的用户的所有旅行信息:
/* Domain Layer */
public class UserManager {
    ...
    public Trip[] getAllTrips(int userId) {
        dao.getAllTrips(userId);
    }
    ...
 }

/* DAL Layer */
public class UserDaoImpl implements IUserDao {
    public Trip[] getAllTrips(int userId) {
        /* jdbc here */
    }
}

它能够正常工作,但我认为我的用户类遭受了“贫血领域问题”(或者贫血POJO问题,这种情况是否存在?):只有私有字段和“getter”和“setter”(所有我的POJO都是如此)。

我考虑了另一种方法:

public class User {
    /* More private fields */
    private Trip[] trips;

    /* getters and setters */
    public Trip[] getTrips() {
        return trips;
    }
    ...
    public void addTrip(Trip trip) {
        // add the trip
    }
}

并且,
public class UserManager {
    public Trip[] getAllTrips(int userId) {
        User user = dao.getUser(userId);
        return user.getTrips();
    }
 }

通过这种第二种方法,用户类具有更多的功能,但是旅行计划并没有存储在数据库中。
我是否遗漏了什么?我是DAO的新手,不知道我是否采取了正确的方法。
谢谢(是的,我的英语很糟糕)。
1个回答

1
为什么不将getAllTrips函数添加到User类中呢?只要您的函数在一个用户对象上运行,就可以向User类添加函数。
如果您对多个用户执行操作,例如,UserManager类就有意义。
cancelTrip(int tripId) 
{ 
    // remove trip from all users 
} 

是的,User类中的getAllTrips函数很有意义(例如使用数组来存储它们),但主要问题在于持久性机制:我认为我应该使用数据库来存储旅行而不是使用简单的数组(或类似的东西)。 - Marcos
我猜问题是你如何设计你的系统。拥有用户对象、行程对象以及它们之间的多对多关系是有意义的。 - Andrzej Bobak
谢谢,我已经有那些对象了。但是,例如,如果我将getAllTrips函数添加到User类中,那么旅行将必须存储在列表或数组中,对吧?然后我将不得不将数组或列表复制到数据库中,对吧?那么为什么不使用DAO直接将旅行存储在数据库中(而不使用中间数组)?我从未使用过数据库,有点困惑。 - Marcos
从阅读关于关系型数据库开始。想象一下您如何在数据库中存储这些数据。设计包含数据的数据库表,最后编写反映这些表的类。之后,您所需的只是读/写机制(例如DAO)。 - Andrzej Bobak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接