Java 中的整洁代码:编写整洁代码的原则与示例

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

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

开始课程

引言:为什么整洁代码是项目成功的关键

每个开发者迟早都会遇到"脏代码":无意义的变量名、数百行的函数、重复的代码块和魔法数字。这样的代码难以阅读、难以维护,且几乎无法在不冒破坏整个应用风险的情况下进行扩展。Robert Martin的著作"Clean Code" 已成为追求高质量代码的程序员的圣经。在本文中,我们将通过清晰的示例解析Java中的整洁代码的关键原则,帮助您编写易理解、可靠且易维护的代码。



1. 命名:用业务语言说话

变量、方法或类名应回答以下问题:"这是什么?"以及"为什么需要它?"。避免使用单字母缩写和抽象术语。



糟糕示例

int d; // 自下单以来的天数List<String> lst = new ArrayList<>();void prc() { ... }


良好示例

int daysSinceOrder;List<String> customerNames = new ArrayList<>();void processPayment() { ... }


额外建议

  • 类名 — 名词:Order、CustomerRepository。
  • 方法名 — 动词或动词组合:saveOrder()、isValidEmail()。
  • 避免 "噪音"词汇:如果不会带来意义,避免使用Data、Info、Manager。


2. 函数:简短、清晰、单一任务

一个函数应该只做一件事并把它做好。理想长度是10-15行。如果一个函数无法在屏幕上完整显示——就拆解它。



糟糕示例:瑞士军刀函数

public void processOrder(Order order) {    // 1. 验证    if (order == null || order.getItems().isEmpty()) {        throw new IllegalArgumentException("Invalid order");    }    // 2. 折扣计算    double discount = 0;    if (order.getTotal() > 1000) discount = 0.1;    // 3. 保存到数据库    database.save(order);    // 4. 发送邮件    emailService.sendConfirmation(order.getCustomerEmail());}


良好示例:职责分离

public void processOrder(Order order) {    validateOrder(order);    applyDiscount(order);    persistOrder(order);    notifyCustomer(order);}

private void validateOrder(Order order) { if (order == null || order.getItems().isEmpty()) { throw new IllegalArgumentException("Invalid order"); }}

private void applyDiscount(Order order) { if (order.getTotal() > 1000) { order.setDiscount(0.1); }}

private void persistOrder(Order order) { database.save(order);}

private void notifyCustomer(Order order) { emailService.sendConfirmation(order.getCustomerEmail());}


3. 避免重复(DRY原则)和魔法数字

重复代码是维护性的主要敌人。如果你正在复制代码块,那么是时候将其提取为单独的方法或常量了。



问题:魔法数字

if (age > 18) { ... } // 18是什么?最小年龄?折扣阈值?


解决方案:命名常量

private static final int MINIMUM_DRIVING_AGE = 18;// ...if (age > MINIMUM_DRIVING_AGE) { ... }


重复示例

// 糟糕double totalForFirst = price1 * quantity1 * 0.95;double totalForSecond = price2 * quantity2 * 0.95;

// 良好double calculateLineTotal(double price, int quantity) { return price * quantity * 0.95;}double totalForFirst = calculateLineTotal(price1, quantity1);double totalForSecond = calculateLineTotal(price2, quantity2);


博客

书籍推荐