1、引言:什么是“代碼異味”?
在軟件開發中,“代碼異味(Code Smell)”是指那些雖然不會導致程序編譯失敗或運行錯誤,但暗示著潛在設計缺陷或可維護性問題的代碼結構。它們是代碼演進過程中的“信號燈”,提示我們某段代碼可能需要優化。
1.1 ? 為什么關注代碼異味?
- 預示潛在風險:可能是未來 bug 的溫床
- 阻礙重構:讓代碼難以理解、測試和修改
- 影響協作效率:閱讀成本高,新人上手難
- 降低系統穩定性:頻繁修改易引入錯誤
1.2 ?? 代碼異味 ≠ Bug
特征 | 異味 | Bug |
---|---|---|
是否編譯通過 | 是 | 否(可能) |
是否運行正確 | 是 | 否 |
是否需要修復? | 建議盡早重構 | 必須修復 |
2、常見的代碼異味類型及其危害
本節將介紹 10 種典型的代碼異味,并提供豐富代碼示例說明其特征及重構建議。
2.1. 長函數(Long Method)
?? 特征:
- 方法體超過 50 行
- 包含多個職責邏輯
- 條件判斷嵌套深
?? 危害:
- 可讀性差
- 測試困難
- 修改容易引入副作用
?? 示例:
public void processOrder(Order order) {if (order == null) throw new IllegalArgumentException();if (order.getItems().isEmpty()) return;double total = 0;for (Item item : order.getItems()) {if (item.getQuantity() > 10) {total += item.getPrice() * item.getQuantity() * 0.9;} else {total += item.getPrice() * item.getQuantity();}}if (order.getCoupon() != null) {total *= order.getCoupon().getDiscountRate();}order.setTotal(total);order.setStatus("PAID");orderRepository.save(order);
}
? 重構建議:
- 提取子方法,按職責拆分邏輯
- 使用命名清晰的方法名表達意圖
private double calculateSubtotal(Order order) {return order.getItems().stream().mapToDouble(this::calculateItemPrice)