項目/教程中使用母語命名的"問題"

早先試圖找使用中文命名代碼的項目, 但所獲寥寥: 索引: 用中文編寫代碼的實用開源項目 · Issue #6 · program-in-chinese/overview. 更不用說教程了: 索引: 用中文代碼做示例的編程教程 · Issue #5 · program-in-chinese/overviewcss

前幾天有幸看到Quora不久前的一個回覆: Has any serious project been written in a non-English-based programming language?java

得知西門子和愛立信內部都有使用母語命名的C/C++代碼(德語/瑞典語). 原文以下:git

At both Siemens (German) and Ericsson (Swedish), I have seen programs written in C, and C++ where the only English words are the keywords. So if, new, else, for and the standard libraries like std::vector<> Everything else was in German or Swedish. ...github

另外, 答者還提到在布拉格碰到過一本Java編程書, 也是用非英語進行命名寫的示例代碼.編程

以母語命名可讀性強的優點, 照理說編程教程應該是很是適合這一實踐的. 那麼來試試:markdown

enum 發薪日 {
    週一, 週二, 週三, 週四, 週五, 週六, 週日;

    private static final int 每班分鐘數 = 8 * 60;

    int 發薪(int 工做分鐘數, int 每分鐘薪水) {
        int 底薪 = 工做分鐘數 * 每分鐘薪水;
        int 加班費;
        switch (this) {
        case 週六:
        case 週日: // 週末
            加班費 = 底薪 / 2;
            break;
        default: // 週中
            加班費 = 工做分鐘數 <= 每班分鐘數 ? 0 : (工做分鐘數 - 每班分鐘數) * 每分鐘薪水 / 2;
        }
        return 底薪 + 加班費;
    }
}
複製代碼

觀感如何? 我的以爲是很是一目瞭然, 但自帶很多槽點.oop

下面看看原版(Effective Java第三版, Item 34的例程):this

enum PayrollDay {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;

    private static final int MINS_PER_SHIFT = 8 * 60;

    int pay(int minutesWorked, int payRate) {
        int basePay = minutesWorked * payRate;
        int overtimePay;
        switch (this) {
        case SATURDAY:
        case SUNDAY: // Weekend
            overtimePay = basePay / 2;
            break;
        default: // Weekday
            overtimePay = minutesWorked <= MINS_PER_SHIFT ? 0 : (minutesWorked - MINS_PER_SHIFT) * payRate / 2;
        }
        return basePay + overtimePay;
    }
}
複製代碼

意思同樣, 可是不是看上去有了些"距離感", 槽點彷佛就沒那麼明顯了, 尤爲不會有太多代入感. 能夠想見, 在翻譯英文原著時, 譯者對代碼自己的命名進行中文化也許會吃力卻討不到多少好.spa

翻了也許會有其餘麻煩的還有這種(同一本書, Item 68):scala

if (car.speed() > 2 * SPEED_LIMIT)    
    generateAudibleAlert("Watch out for cops!");
複製代碼

還有這種(Item 4):

String s = "bikini";
複製代碼

至於下面這個例子(Item 34), 問題是想翻譯都只能找到音譯詞, 也許還不如不翻. 並且, 在示例代碼裏用"桔子", "蘋果"之類在外文編程書籍中家常便飯, 但若是真用在中文代碼中, 彷佛第一感受就有點幼稚.

public enum Apple  { FUJI, PIPPIN, GRANNY_SMITH }
public enum Orange { NAVEL, TEMPLE, BLOOD }
複製代碼

還有一種問題好比(Programming in Scala 第三版, 7.5節):

val firstArg = if (args.length > 0) args(0) else ""
    firstArg match {
      case "salt" => println("pepper")
      case "chips" => println("salsa")
      case "eggs" => println("bacon")
      case _ => println("huh?")
    }   
複製代碼

直譯過來是:

val 參數1 = if (參數.length > 0) 參數(0) else ""
    參數1 match {
      case "鹽" => println("胡椒")
      case "玉米薄片" => println("薩爾薩辣醬")
      case "雞蛋" => println("培根")
      case _ => println("啥?")    
    }  
複製代碼

這幾個詞對於不大瞭解西方飲食習慣的讀者來講, 讀起來徹底沒有感受. 與其費口舌在註解裏普及西方文化, 也許改爲這樣更天然:

val 參數1 = if (參數.length > 0) 參數(0) else ""
    參數1 match {
      case "牛奶" => println("麪包")
      case "燒餅" => println("油條")
      case "煎餅果子" => println("薄脆")
      case _ => println("啥?")    
    }  
複製代碼

但這比起翻譯自己來, 又多了很多工做量, 估計還很難得到原做者的贊成. 固然, 若是是自編文獻, 就沒有原做的限制了, 但就像以前的例子所示, 恐怕選材和尺度都會比用英文代碼更加敏感.

相似的, 在項目中使用中文命名也比英文命名更須要推敲. 隨手寫個奇怪的英文名看起來也許不那麼顯眼, 但用了中文, 就會很是扎眼. 所謂"文如其人", 也許語文的實用性會隨着中文編程的推廣而逐漸迴歸.

相關文章
相關標籤/搜索