引言:为什么整洁代码是项目成功的关键
每个开发者迟早都会遇到"脏代码":无意义的变量名、数百行的函数、重复的代码块和魔法数字。这样的代码难以阅读、难以维护,且几乎无法在不冒破坏整个应用风险的情况下进行扩展。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);