Java 整洁代码:Clean Code 原则与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么整洁代码不是奢侈品,而是必需品

每位开发者至少都遇到过那种不喝杯咖啡、不冥想一会儿就看不懂的代码。变量名是 a、b、temp,方法长达500行,注释写着“这里有魔法,别动”——这些都是项目正在变成“遗留系统”的明确信号。Clean Code(整洁代码)是一种理念和一套实践,能让代码变得可读、易于维护和扩展。

在本文中,我们将通过具体示例,用 Java 语言解析 Clean Code 的关键原则。你将学会如何编写那种半年后你自己和同事都会感激的代码。

原则1:有意义的命名

变量、方法或类的名称应该回答三个问题:它是什么,为什么需要它,以及如何使用它。糟糕的命名是混乱的主要来源。

糟糕的示例

public List<Integer> getList(int a) {
    List<Integer> list = new ArrayList<>();
    for (int i = 0; i < a; i++) {
        list.add(i * 2);
    }
    return list;
}

这个方法做了什么?a 是什么?它返回的是偶数列表吗?还是仅仅把某些东西乘以二?

好的示例(Clean Code)

public List<Integer> generateEvenNumbers(int count) {
    List<Integer> evenNumbers = new ArrayList<>();
    for (int i = 0; i < count; i++) {
        evenNumbers.add(i * 2);
    }
    return evenNumbers;
}

现在无需注释也一目了然:这个方法生成指定长度的偶数列表。

命名规则

  • 类:名词(User,PaymentProcessor)
  • 方法:动词(saveUser(),calculateTotal())
  • 变量:有含义的名词(userName,totalPrice)
  • 避免:缩写(usrNm),单字母名称(循环计数器 i、j 除外)

原则2:单一职责的小方法

一个方法应该只做一件事,并且把它做好。如果一个方法可以用“并且”来描述(先做A,并且再做B),那么它就应该被拆分。

糟糕的示例:单体方法

public void processOrder(Order order) {
    // 验证
    if (order.getItems().isEmpty()) {
        throw new IllegalArgumentException("Order is empty");
    }
    // 计算总价
    double total = 0;
    for (Item item : order.getItems()) {
        total += item.getPrice() * item.getQuantity();
    }
    // 发送邮件
    EmailService.send(order.getCustomerEmail(), "Your order total: " + total);
    // 保存到数据库
    orderRepository.save(order);
}

这个方法做了4件事:验证、计算、发送邮件和保存。如果出了问题,得在整个方法里找原因。

好的示例:整洁的方法

public void processOrder(Order order) {
    validateOrder(order);
    double total = calculateTotal(order);
    sendConfirmationEmail(order, total);
    saveOrder(order);
}

private void validateOrder(Order order) {
    if (order.getItems().isEmpty()) {
        throw new IllegalArgumentException("Order cannot be empty");
    }
}

private double calculateTotal(Order order) {
    return order.getItems().stream()
            .mapToDouble(item -> item.getPrice() * item.getQuantity())
            .sum();
}

private void sendConfirmationEmail(Order order, double total) {
    String message = "Your order total: " + total;
    EmailService.send(order.getCustomerEmail(), message);
}

private void saveOrder(Order order) {
    orderRepository.save(order);
}

每个方法都是一块积木。它们

博客

书籍推荐