第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、一項條件...

results matching ""

    No results matching ""