Java中的Clean Code:面向实践者的原则与示例

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

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

开始课程

Java中的Clean Code:实践中的原则与示例



每位Java开发者迟早都会遇到“脏代码”的问题。难以阅读的方法、无意义的变量名、魔法数字和庞大的类——所有这些都会拖慢开发速度、增加Bug数量并打击团队士气。Robert Martin的《Clean Code》一书已成为那些希望编写高质量软件的人的圣经。在本文中,我们将解析Java中整洁代码的关键原则,并通过具体示例展示如何在实践中应用它们。



1. 变量、方法和类的命名



正确的命名是成功的一半。名称应揭示程序员的意图。如果你需要阅读方法体才能理解它的功能,那么这个命名就是失败的。



糟糕的示例:

int d; // 以天为单位的已用时间List<Integer> lst = new ArrayList<>();public void proc(int a, int b) {    // ...}


良好的示例:

int elapsedTimeInDays;List<Integer> customerIds = new ArrayList<>();public void calculateTotalPrice(double basePrice, double discount) {    // ...}


命名规则:

  • 类和接口 — 名词(Customer, OrderProcessor, PaymentService)。
  • 方法 — 动词或动词结构(saveCustomer, findById, isActive)。
  • 变量 — 有意义的、反映数据本质的名词(userName, totalAmount)。
  • 避免缩写 — 使用fullName而不是fn,否则一个月后你自己都会忘记fn是什么意思。


2. 小方法原则与单一职责原则



方法应该只做一件事,并且把它做好。如果方法包含超过10-15行代码,或者有多个嵌套层级,这就是需要重构的信号。



糟糕的示例(方法做了太多事情):

public void processOrder(Order order) {    // 1. 验证    if (order.getItems().isEmpty()) throw new IllegalArgumentException("Order is empty");    // 2. 计算折扣    double discount = 0;    if (order.getCustomer().isPremium()) discount = 0.1;    // 3. 计算最终价格    double total = 0;    for (Item item : order.getItems()) {        total += item.getPrice() * item.getQuantity();    }    total = total * (1 - discount);    // 4. 保存到数据库    orderRepository.save(order);    // 5. 发送邮件    emailService.sendConfirmation(order.getCustomer().getEmail());}


良好的示例(拆分为小方法):

public void processOrder(Order order) {    validateOrder(order);    double discount = calculateDiscount(order.getCustomer());    double totalPrice = calculateTotalPrice(order, discount);    order.setTotalPrice(totalPrice);    orderRepository.save(order);    sendConfirmationEmail(order.getCustomer());}

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

private double calculateDiscount(Customer customer) { return customer.isPremium() ? 0.1 : 0.0;}

private double calculateTotalPrice(Order order, double discount) { double subtotal = order.getItems().stream() .mapToDouble(item -> item.getPrice() * item.getQuantity()) .sum(); return subtotal * (1 - discount);}

private void sendConfirmationEmail(Customer customer) { emailService.sendConfirmation(customer.getEmail());}


3. 避免代码重复(DRY——Don't Repeat Yourself)



重复是万恶之源。当逻辑在多个地方重复时,任何修改都需要在多处进行更

博客

书籍推荐