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

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

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

开始课程

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

\n

每位Java开发者都遇到过这样的情况:打开一个旧项目,花上几个小时去理解自己几个月前写的东西。更不用说别人的代码了。脏代码会拖慢开发速度,增加bug数量,并打击团队士气。Robert Martin的《Clean Code》一书已成为程序员的圣经,但其原则往往过于抽象。在本文中,我们将通过实际示例,解析Java中Clean Code的关键概念,这些概念今天就可以应用。

\n

整洁代码不是关于完美的语法或追逐潮流。它关乎对同事的尊重,对未来的自己负责,最终也是对业务负责。可读的代码更容易维护、测试和重构。让我们看看如何将Java代码从“能运行”转变为“整洁”。

\n\n

1. 有意义的命名:用领域语言说话

\n

规则:名称应回答“为什么?”、“是什么?”、“怎么做?”

\n

糟糕的命名是整洁代码的头号敌人。像int a、String d或List<Integer> list1这样的变量不传达任何信息。好的名称应揭示程序员的意图。

\n\n
// 糟糕\nint d; // 已过天数\nList<Integer> lst;\n\n// 良好\nint daysSinceCreation;\nList<Integer> customerIds;
\n\n

避免误导性信息

\n

如果变量不是List,而是Set或Map,就不要使用accountList。不要缩写显而易见的内容:用userName而不是usrNm。

\n\n

类名和方法名

\n
    \n
  • 类名:名词(Customer、OrderProcessor)。
  • \n
  • 方法名:动词(calculateTotal()、saveToDatabase())。
  • \n
  • 布尔变量:谓词(isActive、hasPermission)。
  • \n
\n\n
// 糟糕\npublic class Data {\n    public void proc() { ... }\n}\n\n// 良好\npublic class InvoiceCalculator {\n    public BigDecimal calculateTotalAmount() { ... }\n}
\n\n

2. 函数:短小、原子化且无副作用

\n

第一原则:函数应该只做一件事

\n

Java中理想的函数是4-20行。如果一个函数做了不止一件事,就需要拆分。经典标志:如果你能从函数中提取出另一个有意义的函数,那就去做。

\n\n
// 糟糕:函数做了三件事\npublic void processOrder(Order order) {\n    if (order == null) throw new IllegalArgumentException();\n    // 1. 验证\n    if (order.getItems().isEmpty()) {\n        logger.warn("空订单");\n        return;\n    }\n    // 2. 计算总价\n    BigDecimal total = BigDecimal.ZERO;\n    for (Item item : order.getItems()) {\n        total = total.add(item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity())));\n    }\n    // 3. 发送邮件\n    emailService.sendConfirmation(order.getCustomerEmail(), total);\n}\n\n// 良好:每个函数只做一件事\npublic void processOrder(Order order) {\n    validateOrder(order);\n    BigDecimal total = calculateTotal(order);\n    sendConfirmationEmail(order, total);\n}\n\nprivate void validateOrder(Order order) {\n    if (order == null || order.getItems().isEmpty()) {\n        throw new IllegalArgumentException("无效订单");\n    }\n}\n\nprivate BigDecimal calculateTotal(Order order) {\n    return order.getItems().stream()\n            .map(item -> item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity())))\n            .reduce(BigDecimal.ZERO, BigDecimal::add);\n}
\n\n

童子军规则:让营地比你发现时更干净

\n

每次编辑文件时,都要改进它:重命名糟糕的变量,拆分冗长的函数。这可以防止代码熵增。

\n\n<

博客

书籍推荐