使用 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(概念或结构元素,例如List、Button、Color)、simu_real_obj(仿真中的对象) - worker_agent 同义词:
comp_as_worker(带有仿真色彩的相同含义)
这些同义词不改变实际领域;它们仅为开发者提供更清晰的术语。
与现有组件的集成
Clprolf 不 替代 Service、Repository 或 Controller 的角色。它在这些组件之上添加词形变化注解,以强制一致的边界。
典型映射
| 组件类型 | 词形变化 |
|---|---|
| Repository / DAO | worker_agent |
| Service | agent |
| Controller | agent(或 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 手册、规范以及框架源码可在以下地址获取: