第5章:編排
良好而一致的原始碼排版,不能保證你的專業性。 但編排混亂的原始碼,一看就不專業,也令人質疑它的邏輯嚴謹性。
本章所指的「編排」,不僅僅是 IDE 工具中的自動排版功能,更像是出版業的排版。 如何運用有限的空間及文字,讓後續接手維護的的人,可以一目瞭然地閱讀原始碼,就是專業所在。
目的
原始碼的編排是一種溝通方式,而溝通是專業開發者的首要之務。
「讓程式碼能工作」 不是專業開發者的首要之務,因為這只是對開發者的基本要求,我相信不會有人認為程式碼可以被編譯無誤,就是工作完成吧!?
原始碼的程式風格、可讀性與紀律,長遠的影響程式的可維護性及可擴充性。
準則
每個人都會有一些個人偏好,但是在團隊中,所有成員都該依循一套統一的編排規則。
- 書上說,不然會使產品像是意見不同的個體寫成的。 在實務上,尤其是現在IDE都有自動排版功能的情況下,在版本管理工具中會看到的相當可怕的版本差異。所以我們專案在 git push 時,才會導入 formating 的相關檢核機制,直接避免格式不同的程式碼入庫。
- 這件事很重要,所以我把它從書中的章末,移到此處先提。混雜的風格,相當於沒有編排。
- 團隊風格可以演進,但必須遵守。
- 準則應基於使用開發語言及環境的共通準則,如 C、C++、C#、Java、Javascript 各有其常見規範,不要把 C 的原則套到 JAVA 上,反之亦然。
垂直編排
報紙的啟發
可閱讀性
空白行
資訊密度
宣告位置
instance variable 相依函式 dependent functions 概念相似性 conceptual affinity
[註] 我們專案的程式碼範本(Java)
當主要程式碼行數,超過我的螢幕高度時,我會套上這個範本。 在整理重構既有的大型程式碼時,我也會套上這個範本,以方便理解原有邏輯並記錄整理進度。
//================================================
//== [Enumeration Types] Block Start
//== [Enumeration Types] Block End
//================================================
//== [Static Variables] Block Start
//== [Static Variables] Block Stop
//================================================
//== [Instance Variables] Block Start
//== [Instance Variables] Block Stop
//================================================
//== [Static Constructor] Block Start
//== [Static Constructor] Block Stop
//================================================
//== [Constructors] Block Start (含init method)
//== [Constructors] Block Stop
//================================================
//== [Static Method] Block Start
//== [Static Method] Block Stop
//================================================
//== [Accessor] Block Start
//== [Accessor] Block Stop
//================================================
//== [Overrided JDK Method] Block Start (Ex. toString / equals+hashCode)
//== [Overrided JDK Method] Block Stop
//================================================
//== [Method] Block Start
//####################################################################
//## [Method] sub-block :
//####################################################################
//== [Method] Block Stop
//================================================
//== [Inner Class] Block Start
//== [Inner Class] Block Stop
//================================================
- 子概念的分割,使用以下格式
//####################################################################
//## [ ] sub-block :
//####################################################################
水平編排
IDE 自動排版功能
對齊
縮排
blank scope
請考量以下風格優缺:
// 風格 A
while (dis.read(buf, 0, readBufferSize) != -1) ;
// 風格 B
while (dis.read(buf, 0, readBufferSize) != -1)
;
// 風格 C
while (dis.read(buf, 0, readBufferSize) != -1) {
// do nothing
}
[註] SQL 水平編排
先不論垂直對齊的細節如何,大原則應該是每一行呈現一項表示式,一個欄位、一個TABLE、一項條件...