使用 Clprolf 和 `indef_obj` 重构您的类
发布: (2025年12月25日 GMT+8 22:51)
5 min read
原文: Dev.to
Source: Dev.to
大多数开发者都认同 单一职责原则(SRP)。
真正的难点不在于 做什么 —— 而在于 何时 去做。
在实际项目中,我们通常会:
- 编写可运行的代码,
- 随着时间的推移更好地理解它,
- 当职责变得更清晰时进行重构。
Clprolf 通过在重构过程中支持推迟的架构决策,自然地融入了这一工作流。
1️⃣ 从经典的 OOP 类开始
让我们从一个非常常见的例子开始。没有什么新奇的——只是一段 可运行 的类代码。
public class OrderManager {
public void processOrder(Order order) {
if (order.getTotal() <= 0) {
throw new IllegalArgumentException("Invalid order");
}
saveToDatabase(order);
logOrder(order);
String message = formatConfirmation(order);
sendEmail(message);
}
private void saveToDatabase(Order order) {
System.out.println("Saving order " + order.getId());
}
private void logOrder(Order order) {
System.out.println("Order processed: " + order.getId());
}
private String formatConfirmation(Order order) {
return "Order #" + order.getId() + " confirmed";
}
private void sendEmail(String message) {
System.out.println("Sending email: " + message);
}
}
这个类:
- 包含 业务规则,
- 处理 持久化,
- 执行 日志记录,
- 格式化消息,
- 发送电子邮件。
每个人都写过类似的代码。
2️⃣ 在 Clprolf 中无需考虑角色的使用
在 Clprolf 中,你可以 完全相同的方式 开始。无需事先决定任何事情——只需承认架构角色 尚未明确。
public indef_obj OrderManager {
public void processOrder(Order order) {
if (order.getTotal() <= 0) {
throw new IllegalArgumentException("Invalid order");
}
saveToDatabase(order);
logOrder(order);
String message = formatConfirmation(order);
sendEmail(message);
}
private void saveToDatabase(Order order) { }
private void logOrder(Order order) { }
private String formatConfirmation(Order order) { return ""; }
private void sendEmail(String message) { }
}
在此阶段:
- 没有任何强制要求,
- 没有做出任何架构承诺,
- 代码可以这样保持一段时间。
indef_obj 的行为类似经典面向对象编程——但有意识地。
3️⃣ 在理解代码后应用 SRP
随后——正如经典的 SRP 重构一样——你会意识到这个类混合了不同的职责。
| Concern | Nature |
|---|---|
| Business decision | Business |
| Persistence | Technical |
| Logging | Technical |
| Formatting / I/O | Technical |
这就是 Clprolf 发挥作用的地方。
4️⃣ 将职责明确化的重构
Before (indef_obj)
OrderManager
├─ business rule
├─ persistence
├─ logging
└─ notification
After (SRP made explicit)
OrderProcessor (agent)
├─ business decision
OrderRepository (worker_agent)
└─ persistence
OrderNotifier (worker_agent)
├─ logging
└─ messaging
🎯 业务职责 → agent
public agent OrderProcessor {
private final OrderRepository repository;
private final OrderNotifier notifier;
public OrderProcessor(OrderRepository repository,
OrderNotifier notifier) {
this.repository = repository;
this.notifier = notifier;
}
public void process(Order order) {
if (order.getTotal() <= 0) {
throw new IllegalArgumentException("Invalid order");
}
repository.save(order);
notifier.notify(order);
}
}
agent:
- 表达 业务意图,
- 协调各项操作,
- 不包含技术细节。
⚙️ 技术职责 → worker_agent
public worker_agent OrderRepository {
public void save(Order order) {
System.out.println("Saving order " + order.getId());
}
}
public worker_agent OrderNotifier {
public void notify(Order order) {
log(order);
String message = format(order);
send(message);
}
private void log(Order order) {
System.out.println("Order processed: " + order.getId());
}
private String format(Order order) {
return "Order #" + order.getId() + " confirmed";
}
private void send(String message) {
System.out.println("Sending email: " + message);
}
}
工作者可以自由混合技术关注点:
- I/O,
- 格式化,
- 日志记录,
- 基础设施。
这是 可接受的,因为业务含义仍然保留在 agent 中。
5️⃣ 变化了什么 — 以及没有变化的
❌ 未改变的内容
- 算法,
- 行为,
- 性能,
- 表达能力。
✅ 已改变的内容
- 责任变得明确,
- 架构意图变得可见,
- 未来演进更容易。
这就是 SRP 结构化应用。
🧩 结论
Clprolf 不要求开发者思考得更深入——更不会更早要求。它让他们在准备好时思考。
- 先写代码,
- 随后再理解,
- 需要时重构职责。
indef_obj 不是目标——它是支持真实世界开发的临时状态。
从这个意义上说,Clprolf 不仅仅是一种语言。它是一个用于架构清晰度的重构工具。
