早先試圖找使用中文命名代碼的項目, 但所獲寥寥: 索引: 用中文編寫代碼的實用開源項目 · 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("啥?") } 複製代碼
但這比起翻譯自己來, 又多了很多工做量, 估計還很難得到原做者的贊成. 固然, 若是是自編文獻, 就沒有原做的限制了, 但就像以前的例子所示, 恐怕選材和尺度都會比用英文代碼更加敏感.
相似的, 在項目中使用中文命名也比英文命名更須要推敲. 隨手寫個奇怪的英文名看起來也許不那麼顯眼, 但用了中文, 就會很是扎眼. 所謂"文如其人", 也許語文的實用性會隨着中文編程的推廣而逐漸迴歸.