使用 Clprolf 和 `indef_obj` 重构您的类

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

Source: Dev.to

Charles Koffler

大多数开发者都认同 单一职责原则(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 重构一样——你会意识到这个类混合了不同的职责。

ConcernNature
Business decisionBusiness
PersistenceTechnical
LoggingTechnical
Formatting / I/OTechnical

这就是 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 不仅仅是一种语言。它是一个用于架构清晰度的重构工具

Back to Blog

相关文章

阅读更多 »

SOLID 再探 — 后模式视角

为什么原则不如背后的力量重要:SOLID 不是一份检查清单,而是对更深层力量的历史压缩。这是系列的第 5 部分。