You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于整洁架构优化同逻辑类:如何重构canDoX方法?

按照整洁架构“核心业务逻辑独立于基础设施层,依赖方向向内”的要求,我们可以通过以下步骤重构canDoX方法:

1. 把业务规则从数据实体中彻底抽离

canDoX的判断逻辑属于核心业务规则,不应该和数据库映射实体绑定。我们可以把它放到一个纯业务类里,这个类不依赖任何ORM实体,只负责维护业务判断逻辑:

// 核心领域类:只处理业务规则,和数据持久化完全解耦
public class MyDataBusinessRules {
    public static boolean canDoX(String statusA, String statusB) {
        return "z".equals(statusA) && "y".equals(statusB);
    }
}

2. 让数据实体类复用统一的业务规则

原来的MyData和新建的MyDataWithHalfOfFields只需要做数据载体,直接调用业务类的方法即可,不用自己实现判断逻辑:

修改后的MyData

class MyData {
    String statusA;
    String statusB;
    String statusC;
    ...
    Something field20;

    boolean canDoX() {
        return MyDataBusinessRules.canDoX(this.statusA, this.statusB);
    }
}

修改后的MyDataWithHalfOfFields

class MyDataWithHalfOfFields {
    String statusA;
    String statusB;
    String statusC;
    ...
    Something field10;

    boolean canDoX() {
        return MyDataBusinessRules.canDoX(this.statusA, this.statusB);
    }
}

3. 进阶:用依赖反转强化架构分层

如果想更严格贴合整洁架构的依赖反转原则,可以定义一个抽象接口,描述业务规则需要的属性,让两个实体类实现该接口,业务规则类只依赖这个抽象接口:

定义领域层抽象接口

public interface StatusForXProvider {
    String getStatusA();
    String getStatusB();
}

实体类实现接口

class MyData implements StatusForXProvider {
    String statusA;
    String statusB;
    // 其他字段...

    @Override
    public String getStatusA() {
        return statusA;
    }

    @Override
    public String getStatusB() {
        return statusB;
    }

    boolean canDoX() {
        return MyDataBusinessRules.canDoX(this);
    }
}

class MyDataWithHalfOfFields implements StatusForXProvider {
    String statusA;
    String statusB;
    // 其他字段...

    @Override
    public String getStatusA() {
        return statusA;
    }

    @Override
    public String getStatusB() {
        return statusB;
    }

    boolean canDoX() {
        return MyDataBusinessRules.canDoX(this);
    }
}

更新业务规则类

public class MyDataBusinessRules {
    public static boolean canDoX(StatusForXProvider provider) {
        return "z".equals(provider.getStatusA()) && "y".equals(provider.getStatusB());
    }
}

重构后的好处

  • 避免重复代码:业务逻辑只维护一份,两个实体类复用同一套规则。
  • 符合整洁架构:核心业务规则不依赖外层的数据库实体,所有依赖都指向领域层内部。
  • 扩展性强:以后新增类似的裁剪实体类,只要实现StatusForXProvider接口,就能直接复用canDoX逻辑,不用重复写判断。

内容的提问来源于stack exchange,提问作者Moko Doko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:33:25