【问题标题】:Anemic domain object?贫血域对象?
【发布时间】:2011-12-04 13:14:53
【问题描述】:

在我的系统中,用户可以发布任意数量的旅行。小米用户类(域对象)是这样的

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 */
    }
}

它有效,但我认为我的 User 类遇到“贫血域问题”(或贫血 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();
    }
 }

使用第二种方法,User 类具有更多功能,但行程不会存储在数据库中。

我错过了什么?我是 DAO 的新手,我不知道我是否采取了正确的方法。

谢谢(是的,我的英语很烂)。

【问题讨论】:

    标签: dao pojo anemic-domain-model


    【解决方案1】:

    为什么不在 User 类中添加 getAllTrips 函数呢?只要您的函数适用于一个用户对象,就可以将函数添加到 User 类。

    如果您对多个用户执行操作,例如 UserManager 类将是有意义的。

    cancelTrip(int tripId) 
    { 
        // remove trip from all users 
    } 
    

    【讨论】:

    • 是的,User 类中的 getAllTrips 函数是有意义的(例如,使用数组来存储它们),但主要问题是关于持久性机制:我认为我应该使用数据库来存储旅行,而不是使用简单的数组(或类似的)。
    • 我想问题是你是如何设计你的系统的。拥有用户对象、行程对象以及它们之间的多对多关系是有意义的。
    • 谢谢,我已经有了这些对象。但是,例如,如果我将 getAllTrips 函数添加到 User 类,则行程必须存储在列表或数组中,对吗?然后我必须将数组或列表复制到数据库,对吗?那么为什么不使用 DAO(没有中间数组)将行程直接存储在数据库中呢?我从来没有使用过数据库,我有点困惑。
    • 从阅读关系数据库开始。想象一下,您希望如何将这些数据存储在数据库中。设计包含数据的数据库表,最后编写反映这些表的类。之后,您需要的只是读/写机制(例如 DAO)
    猜你喜欢
    • 2017-10-29
    • 2018-12-14
    • 2010-11-04
    • 1970-01-01
    • 2010-12-26
    • 2014-07-24
    • 2011-09-19
    • 2010-10-28
    • 2020-01-29
    相关资源
    最近更新 更多