使用 Clprolf 分离类职责

发布: (2025年12月5日 GMT+8 02:06)
5 min read
原文: Dev.to

Source: Dev.to

概览

设计干净、结构良好的类是面向对象编程中的核心挑战。
Clprolf 引入了 declensions(词形变化)——一种简单的方式来表达类的性质及其所属领域——而不取代现有的架构。仓库、服务、控制器、实体和抽象仍然保持原位;词形变化被添加在其上以确保一致性。

词形变化

词形变化指示一个类是属于业务/领域层(agent)还是技术层(worker_agent)。该术语借自自然语言,词形会根据使用方式变化,但核心身份保持不变。

主要词形变化

词形变化典型职责
agent业务逻辑、领域概念、抽象、仿真实体
worker_agent技术组件:仓库、显示逻辑、文件操作、系统交互、启动器

同义词

在同一词形变化内部,同义词细化意图但不改变领域。

  • agent 同义词:abstraction(概念或结构元素,例如 ListButtonColor)、simu_real_obj(仿真中的对象)
  • worker_agent 同义词:comp_as_worker(带有仿真色彩的相同含义)

这些同义词不改变实际领域;它们仅为开发者提供更清晰的术语。

与现有组件的集成

Clprolf 替代 Service、Repository 或 Controller 的角色。它在这些组件之上添加词形变化注解,以强制一致的边界。

典型映射

组件类型词形变化
Repository / DAOworker_agent
Serviceagent
Controlleragent(或 worker_agent,如果架构将控制器视为纯技术端点)

继承规则

Clprolf 间接监管组件之间的继承:

  • worker_agent 不能继承自 agent(例如,仓库不能继承自服务)。
  • agent 不能继承自技术类。
  • 同一词形变化的两个类可以继承,但如果使用了不同的同义词,会发出警告,表明视角不同。

这些规则防止意外的跨领域继承,长期保持职责清晰。

与 DDD 与 Clean Architecture 的比较

  • DDD 依赖约定和团队纪律来建模领域并维护通用语言。
  • Clean Architecture 通过指南、模式和项目结构分离领域层和技术层。
  • Clprolf 在语言层面强制领域与技术角色,将架构边界转化为编译器检查的保证。

因此,Clprolf 与 DDD 和 Clean Architecture 并行工作,提供额外的安全性而不取代它们。

方法比较

方法关注点强制方式
DDD领域建模、通用语言约定与团队纪律
Clean Architecture领域层与技术层的分离指南、模式、项目结构
Clprolf词形变化:领域 vs. 技术角色编译器检查,由语言本身强制

示例用法(Java)

// Business logic (agent)
@Agent
public class OrderService {

    private final OrderRepository repository = new OrderRepository();

    public void validateAndStore(String orderId) {
        // Business logic
        System.out.println("Validating order " + orderId);

        // Technical operation delegated to a worker_agent
        repository.save(orderId);
    }
}
// Technical work (worker_agent)
@Worker_agent
public class OrderRepository {

    public void save(String orderId) {
        System.out.println("Saving order " + orderId);
    }
}
// Illegal inheritance – compilation error
@Worker_agent
public class WrongRepo extends OrderService {
    // ❌ A worker_agent cannot inherit from an agent.
}
// Domain object (agent)
@Agent
public class Animal {

    public void eat(String food) {
        System.out.println("The animal eats " + food);
    }
}
// Service using technical workers
@Agent
public class CheckoutService {

    private final OrderRepository orders = new OrderRepository();
    private final PaymentRepository payments = new PaymentRepository();

    public void checkout(String orderId) {
        orders.save(orderId);
        payments.process(orderId); // Technical operation
    }
}

这些示例表明:

  • 现有组件(Service、Repository、Controller)保持不变。
  • 添加 @Agent@Worker_agent 可明确每个类的领域。
  • 继承遵循业务 ↔ 技术分离,防止意外混用。

好处

  • 明确的业务与技术逻辑分离
  • 编译器检查的边界,减少意外的跨领域继承。
  • 通过词形变化同义词保持术语一致
  • 兼容 SOLID 原则、DDD 与 Clean Architecture
  • 可预测、可读、易维护 的代码库,帮助新成员快速上手。

进一步阅读

完整的 Clprolf 手册、规范以及框架源码可在以下地址获取:

https://github.com/charleskoffler/clprolf

Back to Blog

相关文章

阅读更多 »

2026年系统设计完整指南

引言 我花了近十年的时间撰写关于帮助工程师学习新技能并提升职业生涯的各种方法。我有两个伟大的…