天天看點

中英文代碼對比系列之Java一例

這個系列将對同一段代碼進行中文命名和英文命名兩個版本的比較. 目的包括, 示範中文命名, 發現命名時可能遇到的問題, 探讨代碼風格(中文命名的'套路')等. 示例中的命名風格僅基于個人非常有限的實踐, 希望抛磚引玉.

不在讨論範圍内的是:

  • 中英文代碼的可讀性孰高孰低. 個人相信用英文和中文都能寫出可讀性很好的代碼. 差別僅在于母語不同的開發者對哪個版本更敏感, 讀寫維護起來更省工.
  • 原代碼本身的優化/風格問題. 如果認為有更有代表性的代碼, 請不吝推薦.
  • 代碼輸入的便捷性. 前作 對在代碼中使用中文命名的質疑與回應 '中文輸入太慢, 降低開發效率'一節中有所涉及, 打算另開題探讨.

下面一段代碼選自Clean Code: A Handbook of Agile Software Craftsmanship一書, 19頁. 已經經過了作者的命名改進. 由于本人也沒有看過全書, 如果此段代碼在此書之後某節仍有命名改進, 請麻煩指出.

public List<Cell> getFlaggedCells() {
    List<Cell> flaggedCells = new ArrayList<Cell>();
    for (Cell cell : gameBoard)
      if (cell.isFlagged())
        flaggedCells.add(cell);
    return flaggedCells;
  }           

中文命名版:

public List<格類> 取被标的格() {
    List<格類> 被标的格 = new ArrayList<格類>();
    for (格類 某格 : 雷區)
      if (某格.是被标的())
        被标的格.add(某格);
    return 被标的格;
  }           

這裡觸及了幾處典型的中文命名問題. 首先, 是沒有大小寫區分類和變量名(Cell cell). 個人采用的是在類名中使用字尾'類'. 暫時沒有發現有類名本身就用'類'結尾的情況(那樣會出現

XXX類類

的命名), 即使如此, 應該可以用改為

類型

結尾來規避(就成為

XXX類型類

). 變量名也與類名有一緻之處, 就是所有關于格類的變量都用xx格命名, 與英文命名方法相同.

下面, 是單複數的差別.

flaggedCells

是個List, 它用複數命名的意思是"可能包含多個格". 而實際上這個變量可能隻包含一個格. 中文中的名詞不分單複數, 正好符合"這個變量有可能含有單個或多個元素"這個語義. 是以命名為

被标的格

感覺可行. 假如語義需要強調有多個(不可能隻有單個或沒有), 可以考慮加上修飾如

多個

字首等等.

相比之下, 如何在for循環中表示單數有些麻煩. 這個for循環的語義大概是:

for one/each cell in the gameboard, if the cell is flagged, add the cell to...

, 原代碼中沒對

one/each cell

the cell

作出區分. 對應中文大約是

對于雷區中的每一格, 如果這一格是被标的, 就把這一格加到...

. 同樣也很難在代碼中用一個詞展現

每一格

這一格

這兩個有差别的語義. 另外可能的命名有

一格

,

每格

此格

, 在不需突出單數的情況下直接用

等等.

get字首的方法名, 中文采用了對應的

, 用動詞短語可以和變量名區分, 這和英文命名類似. 有個潛在的技術問題, 就是Bean中get的特殊規則. 個人認為在這種情況下可以采用混用, 即

get被标的格

. 這個Spring Boot的

示範程式

中就是如此.

is字首的方法名, 一般認為是傳回布爾值的方法. 這裡采用的命名

是被标的

是個很直白的對應命名. 既保留了

作為表示傳回布爾值, 也保留了被動語态. 個人覺得稍顯累贅, 但與其他命名一緻(取'被标的'格, '被标的'格), 并且易于使用在其他情況, 比如

isRunning

->

是運作中的

isTerriblyDamaged

是被嚴重損壞的

等等. 不失為一種可行的風格. 這裡原本使用了

是被标記的

, 但感覺去掉一字也可以接受.

此外,

gameBoard

沒有采用直譯, 而是用

雷區

, 因為這個代碼在原作中是假想從一個mine sweeper game(掃雷遊戲)中選取的, 是以感覺比較适合. 當然, 原代碼中

gameBoard

也可以用

mineField

使這一段單獨出來的代碼更有語境. 但正如開頭聲明, 此文并不對中英文代碼之間的可讀性進行比較. 這裡也就不拘泥于找到

gameBoard

的對應中文了.

再次歡迎各種推敲.

2017-11-09