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

标签 java oop tdd domain-driven-design

我目前正在使用的遗留 Java 代码库使用了一个臭名昭著的框架。它在包装精美的 jar 中为我提供了开箱即用的域类。域类只不过是一袋 getter 和 setter。

这阻止了我通过从静态 Util 类中提取过程代码到正确的位置(即域类本身)来培育丰富的域模型。例如,考虑以下方法中的逻辑:

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

这可以在 User 类中很好地表达为 isFriendOf(User another) 。然而,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);

最佳答案

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

是否可以向生命周期方法注入(inject)一些东西?

例如:

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(user)
3)如果需要的话,在AClassIDontKnowUnitTest中使用DomainModelMapper的模拟。

关于java - 打包域类上下文中的丰富域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19590206/

相关文章:

javascript - 结构化 javascript 变量声明中的自引用

ruby - 在 Cucumber 中使用带有背景的变量

java - Java中如何访问一个对象的父对象?

ios - 用于 PC Mockito 模拟验证的自定义 Hamcrest 匹配器

ruby-on-rails - 如何使用 Ruby on Rails 测试 AJAX?

java - 在 SWT 中将多个图像加载到滚动合成中

java - 如何让我的 AlertDialog 在 EditText 获得焦点时立即出现?

Java ResultSet 复制到通用对象或列表

java - 如何将 JXLS 从版本 1 迁移到版本 2

C# - 访问说明符 - 用于访问同一命名空间中的方法