Java 整洁代码:拯救项目的规则

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

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

开始课程

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

\n\n

想象一下,你进入一个别人的项目。类名叫做 Class1、Manager、UltraProcessor。方法什么都做:既查询数据库,又渲染 HTML,还发送邮件。而变量名是 x、y、temp。熟悉吗?如果是,你就知道这样的代码能多快把开发者的生活变成地狱。

\n\n

Java 整洁代码不是关于吹毛求疵。而是关于尊重同事、尊重未来的自己、尊重业务。脏代码会使开发速度减慢 2-3 倍,让 Bug 难以捉摸,让重构变得不可能。在本文中,我们将讨论具体的规则,帮助你编写令人愿意阅读和维护的代码。

\n\n

规则 #1:命名——成功的一半

\n\n

Robert Martin(Bob 大叔)在《整洁代码》一书中指出:好的名字可以替代注释。Java 开发者常常犯抽象命名的毛病。让我们来纠正这一点。

\n\n

变量:说出你存储的内容

\n\n

糟糕:

\n
int d; // 以天为单位的已用时间
\n\n

良好:

\n
int elapsedTimeInDays;
\n\n

糟糕:

\n
List<String> list = new ArrayList<>();
\n\n

良好:

\n
List<String> customerNames = new ArrayList<>();
\n\n

方法:动词 + 上下文

\n\n

方法应该回答“做什么?”这个问题。避免使用像 process、handle、doStuff 这样的通用词。

\n\n

糟糕:

\n
public void process(int id) {\n    // 50 行代码:检查、计算、发送邮件\n}
\n\n

良好:

\n
public void sendEmailConfirmation(int orderId) {\n    // 仅包含发送邮件的逻辑\n}
\n\n

类:名词,避免寄生后缀

\n\n

除非有充分理由,否则避免使用 Manager、Processor、Util。类应该反映实体。

\n\n

糟糕:DataProcessor、UserManager

\n

良好:UserRepository、InvoiceCalculator、EmailSender

\n\n

规则 #2:方法——短小且单一职责

\n\n

黄金法则:一个方法——一个职责。如果方法超过 15-20 行,很可能需要拆分。这能提高 Java 代码的可读性并简化测试。

\n\n

重构示例

\n\n

之前:

\n
public boolean isValidOrder(Order order) {\n    if (order == null) return false;\n    if (order.getItems().isEmpty()) return false;\n    double total = 0;\n    for (Item item : order.getItems()) {\n        total += item.getPrice() * item.getQuantity();\n    }\n    if (total > 10000) {\n        // 检查信用额度\n        User user = userRepository.findById(order.getUserId());\n        return user.getCreditLimit() >= total;\n    }\n    return true;\n}
\n\n

之后:

\n
public boolean isValidOrder(Order order) {\n    if (isOrderNullOrEmpty(order)) return false;\n    double total = calculateTotal(order);\n    if (isHighValueOrder(total)) {\n        return hasSufficientCredit(order.getUserId(), total);\n    }\n    return true;\n}\n\nprivate boolean isOrderNullOrEmpty(Order order) {\n    return order == null || order.getItems().isEmpty();\n}\n\nprivate double calculateTotal(Order order) {\n    return order.getItems().stream()\n            .mapToDouble(item -> item.getPrice() * item.getQuantity())\n            .sum();\n}\n\nprivate boolean isHighValueOrder(double total) {\n    return total > 10000;\n}\n\nprivate boolean hasSufficientCredit(int userId, double total) {\n    User user = userRepository.findById(userId);\n    return user.getCreditLimit() >= total;\n}
\n\n

规则 #3:注释——只在万不得已时使用

\n\n

注释常常是糟糕代码的借口。与其写“// 获取”

博客

书籍推荐