打包域类上下文中的丰富域

时间:2013-10-25 12:43:02

标签: java oop tdd domain-driven-design

我目前正在使用的遗留Java代码库使用了一个臭名昭着的框架。它在包装精美的罐子里为我提供了开箱即用的域类。域类只不过是吸气剂和吸尘剂袋。

这使我无法通过将静态Util类中的过程代码提取到合法的位置(即域类本身)来繁殖富域模型。例如,考虑以下方法中的逻辑:

public static boolean areFriends(User user1, User user2) {
    for (User friend : user1.getFriends()) {
        if (friend.equals(user2)) {
            return true;
        }
    }
    return false;
}

这可以在isFriendOf(User another)类中很好地表达为User。但是,User类全部被锁定。顺便说一句,框架使用生命周期方法传递User对象:

//Life-cycle method
public void execute(FrameworkBlob frameworFattyObject) {
    ...
    User user = frameworFattyObject.getUser();
    User loggedInUser = getLoggedInUserFromSomewhere();
    bool areFriends = BadUtilClass.areFriends(user, loggedInUser);
    ...  
}

记住可测试性,有没有办法可以说:

bool areFriends = user.isFriendOf(loggedInUser);

1 个答案:

答案 0 :(得分:1)

不熟悉臭名昭着的框架。我应该先评论,但这太长了。

是否有可能在生命周期方法中注入一些东西?

例如:

public class AClassIDontKnow {

    private DomainModelMapper mapper;//inject this
    //Life-cycle method
    public void execute(FrameworkBlob frameworFattyObject) {
        ...
        UserDomainModel user = mapper.getUser(frameworFattyObject);
        UserDomainModel loggedInUser = getLoggedInUserFromSomewhere();
        bool areFriends = user.isFriendOf(loggedInUser);
        ...  
    }
}

public class DomainModelMapper {
    UserDomainModel getUser(FrameworkBlob frameworFattyObject) {
         User userAnemicModel = frameworFattyObject.getUser();
         //map the anemicModel to a rich domain model
         return ....;
    }
}

因此测试策略:
1)放置DomainModelMapperUnitTest来测试映射 2)UserDomainModelUnitTest涵盖isFriend(用户)
3)如果需要,在AClassIDontKnowUnitTest中使用mock for DomainModelMapper。