代碼是給人讀的,順便能在機器上跑。許多看似微不足道的編碼習慣,實則是可讀性與維護性的隱形殺手。本文揭露四大高頻陋習,提供具體改進方案,助你編寫自文檔化、低認知負荷的優雅代碼。
現狀:局部變量、方法參數、實例字段混用同一命名風格(如均用 camelCase),閱讀者須反覆上下文切換才能判斷變量屬性。
反例:
public boolean equals(Object arg) {
if (!(arg instanceof Range)) return false;
Range other = (Range) arg;
return start.equals(other.start) && end.equals(other.end); // start/end 是字段?局部?參數?
}
改進:引入語義前綴區分作用域
a 前綴(argument) → aOtherf 前綴(field) → fStart、fEndotherpublic boolean equals(Object aOther) {
if (!(aOther instanceof Range)) return false;
Range other = (Range) aOther;
return fStart.equals(other.fStart) && fEnd.equals(other.fEnd);
}
核心價值:一眼識別變量生命週期與可見性,消除「這是字段還是局部?」的心智切換成本。這非匈牙利標記法(編碼類型),而是編碼作用域語義,現代 IDE 顏色區分無法完全替代(代碼評審、Git diff、紙面閱讀場景)。
現狀:com.app.action、com.app.dao、com.app.model、com.app.util。同一業務特性的類被拆散到多個包,導致:
public,破壞封裝,package-private 失效。改進:按業務特性/領域分包
com.app.painting // Painting、PaintingDAO、PaintingAction、statements.sql、view.jsp
com.app.auction
com.app.useraccess
com.app.util // 真正通用的基礎設施代碼
收益:
package-private,僅暴露必要 API。誤區澄清:分層架構不等於包結構分層。架構分層通過依賴規則(如 Controller 依賴 Service,Service 依賴 Repository)約束,而非物理包隔離。ArchUnit 等工具可自動驗證架構規則。
現狀:習慣性為數據載體生成無參構造器 + 全套 Getter/Setter,即使對象邏輯上應不可變(如訂單 ID、金額、創建時間)。
不可變對象優勢:
改進方案:
record、Lombok @Value、手寫不可變類(final 字段、無 Setter、構造器驗證、防御性拷貝集合)。Bloch 語錄:「除非有充分理由使類可變,否則應使其不可變。」
現狀:類文件開頭堆砌私有字段、構造器、私有方法,公共 API 埋在文件末尾。閱讀者必須穿越實現細節才能看到「這個類能做什麼」。
認知科學依據:人類理解遵循「由抽象到具體、由接口到實現」的自上而下過程。先見公共契約,建立心智模型,再按需深入實現細節。
改進:遵循 Javadoc/IDE 大綱順序組織類結構
歷史佐證:C++ 社區早已修正此規範(Google C++ Style Guide、ISO C++ Core Guidelines 均要求 public 先行)。Java 早期慣例受 C 結構體影響,現應主動糾偏。
工具輔助:IntelliJ IDEA Code > Rearrange Code、Save Actions 插件可自動按規則排序成員。
良好習慣非約束,而是解放。消除命名歧義、重塑包結構、擁抱不可變性、正確組織類結構,四大改動讓代碼自我解釋、易於導航、安全併發、愉悅閱讀。從今天的提交開始,做代碼閱讀者的貼心人。