为什么整洁代码不是奢侈品,而是必需品
\n\n想象一下,你进入一个别人的项目。类名叫做 Class1、Manager、UltraProcessor。方法什么都做:既查询数据库,又渲染 HTML,还发送邮件。而变量名是 x、y、temp。熟悉吗?如果是,你就知道这样的代码能多快把开发者的生活变成地狱。
Java 整洁代码不是关于吹毛求疵。而是关于尊重同事、尊重未来的自己、尊重业务。脏代码会使开发速度减慢 2-3 倍,让 Bug 难以捉摸,让重构变得不可能。在本文中,我们将讨论具体的规则,帮助你编写令人愿意阅读和维护的代码。
\n\n规则 #1:命名——成功的一半
\n\nRobert Martin(Bob 大叔)在《整洁代码》一书中指出:好的名字可以替代注释。Java 开发者常常犯抽象命名的毛病。让我们来纠正这一点。
\n\n变量:说出你存储的内容
\n\n糟糕:
\nint d; // 以天为单位的已用时间\n\n良好:
\nint elapsedTimeInDays;\n\n糟糕:
\nList<String> list = new ArrayList<>();\n\n良好:
\nList<String> customerNames = new ArrayList<>();\n\n方法:动词 + 上下文
\n\n方法应该回答“做什么?”这个问题。避免使用像 process、handle、doStuff 这样的通用词。
糟糕:
\npublic void process(int id) {\n // 50 行代码:检查、计算、发送邮件\n}\n\n良好:
\npublic void sendEmailConfirmation(int orderId) {\n // 仅包含发送邮件的逻辑\n}\n\n类:名词,避免寄生后缀
\n\n除非有充分理由,否则避免使用 Manager、Processor、Util。类应该反映实体。
糟糕:DataProcessor、UserManager
良好:UserRepository、InvoiceCalculator、EmailSender
规则 #2:方法——短小且单一职责
\n\n黄金法则:一个方法——一个职责。如果方法超过 15-20 行,很可能需要拆分。这能提高 Java 代码的可读性并简化测试。
\n\n重构示例
\n\n之前:
\npublic 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之后:
\npublic 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注释常常是糟糕代码的借口。与其写“// 获取”