1. 程式人生 > >中文寫程式,何陋之有?

中文寫程式,何陋之有?

我近期經常放出一些用中文寫的類庫、程式碼,總會招致圍觀,搞得我跟動物園裡新來的稀有動物似的。

我們姑且笑而置之,我的確沒什麼高深的技術,但這和用中文寫程式碼沒有任何聯絡,從中不難看出,有些人覺得用中文寫程式碼就是不入流的、沒水準的、齷齪的、低俗的。我只想問這些人一句話:你尊重你的母語——漢語嗎?

正名

人無貴賤,語言更是沒有優劣之分。沒有任何人敢說英語是最優秀、最高貴的語言,其他都是劣等語言;也沒有任何人曾說過寫程式必須用英文(也許你說過,我沒聽過)。

嘲笑用中文寫程式,就像是C#程式設計師看不起VB程式設計師一樣,殊不知其實語言僅僅是工具而已呀。

你拿著關老爺的大刀別人會心生畏懼,這個工具很威風,但你半天砍不死只鴨子,這隻會讓旁人笑得比關老爺臉還紅。

相比工具而言,人們更在乎你能做什麼;就像武俠小說裡,大俠手中草木皆兵刃,小嘍囉的利劍弄不好還傷了自己;十八般兵器,用什麼看你自己的喜好,能耍成什麼樣則要看你自己的本事。

用什麼語言說話,怎可用於衡量一個人的貴賤?用什麼語言編寫程式碼,又怎能用以衡量一個程式的優劣?

有道是“存在即合理”,在某些人唏噓之前,不妨先看看中文寫程式碼有什麼切實的好處吧:

優點

  1. 易於理解。
    咱們這些人中雖然不少人英文不錯,但總也不如母語理解起來自然、高效、準確吧?
    有些人英語一般,就通過查詞典寫出了一堆不倫不類的英文命名,數日後再看自己的程式碼,又要去查詞典,這自己麻煩不要緊,權當學英語了,問題是這程式碼拿去給別人看,人家一看就頭大。這時如果直截了當地使用中文命名,不就什麼問題都解決了嗎?
    並且中文命名還可以顯著減少程式碼註釋,降低程式碼閱讀難度。
    試讀這段程式碼(我的英文水平很爛,所以我就是隻能通過查詞典來寫出不倫不類的命名):
  2.  1 /// <summary>
     2 
     3 /// 執行充值,並返回是否成功
     4 
     5 /// </summary>
     6 
     7 public bool RunSupplement(DatabaseEntities c)
     8 
     9 {
    10 
    11     if (Verify(this)==true)
    12 
    13     {
    14 
    15         this.UsedTime = DateTime.Now;
    16 
    17         this.UsedUser = Membership.GetUser().UserName;
    18 
    19         var
    p= UserProfile.GetUserInfo(this.UsedUser); 20 21 p. SupplementPoint += this.Value; 22 23 p.Save(); 24 25 c.SaveChanges(); 26 27 return true; 28 29 } 30 31 return false; 32 33 }

    再試讀這段程式碼:

     1 /// <summary>
     2 
     3 /// 執行充值,並返回是否成功
     4 
     5 /// </summary>
     6 
     7 public bool 執行充值(DatabaseEntities c)
     8 
     9 {
    10 
    11     if (檢驗有效性(this)==true)
    12 
    13     {
    14 
    15         this.使用時間 = DateTime.Now;
    16 
    17         this.使用使用者 = Membership.GetUser().UserName;
    18 
    19         var p= UserProfile.獲取使用者資訊(this.使用使用者);
    20 
    21         p.充值點數 += this.面值;
    22 
    23         p.Save();
    24 
    25         c.SaveChanges();
    26 
    27         return true;
    28 
    29     }
    30 
    31     return false;
    32 
    33 }


    哪個理解起來更輕鬆?
    在這裡,程式碼本身其實就像是一段註釋,不是嗎?你還要堅持用英文寫程式,而在字裡行間穿插中文註釋嗎?
    另外,我不知道各位初學程式時看到程式碼是什麼感覺,我當時感覺那堆程式碼就是天書、就是密碼,尤其是當我連關鍵字、類、屬性、方法等等的概念還沒有的時候,那些簡直是不可理解的東西,這些程式碼就像是程式設計師的“黑話”,讓外行人犯暈。而假如我們的示例程式碼都穿插中文命名的話,是不是可以便於新手理解、降低門檻、打破神祕感呢?
    此外,出於同樣的原因,InfoQ中也有這樣一篇文章推薦使用中文命名測試方法:

  3. 在英文程式碼之間清晰可辨。
    在英文程式碼中加入中文,就如同在羊群中加入奶牛一樣,你總能一眼找出你加進去的東西。
    當我們需要重新審視一個方法的引數的功能時,你會發現使用中文為引數命名是絕佳的做法。
    還是先來看看咱的爛英文寫出的方法:
     1 public static Image CutImage(Image Image, Point StartPoint, Size CutSize)
     2 
     3 {
     4 
     5     Bitmap resizedBmp = new Bitmap(CutSize.Width, CutSize.Height);
     6 
     7     Graphics g = Graphics.FromImage(resizedBmp);
     8 
     9     g.DrawImage(Image, new Rectangle(0, 0, CutSize.Width, CutSize.Height), new Rectangle(StartPoint.X, StartPoint.Y, CutSize.Width, CutSize.Height), GraphicsUnit.Pixel);
    10 
    11     return resizedBmp;
    12 
    13 }

    這樣一小坨程式碼雖然很簡單,但你要找到引數被使用的位置還是有點頭疼的,而如果它們變成“奶牛”的話……

     1 public static Image 剪裁影象(Image 影象, Point 起始座標, Size 剪裁尺寸)
     2 
     3 {
     4 
     5     Bitmap resizedBmp = new Bitmap(剪裁尺寸.Width, 剪裁尺寸.Height);
     6 
     7     Graphics g = Graphics.FromImage(resizedBmp);
     8 
     9     g.DrawImage(影象, new Rectangle(0, 0, 剪裁尺寸.Width, 剪裁尺寸.Height), new Rectangle(起始座標.X, 起始座標.Y, 剪裁尺寸.Width, 剪裁尺寸.Height), GraphicsUnit.Pixel);
    10 
    11     return resizedBmp;
    12 
    13 }



    如果你還覺得找起來費勁的話就得配花鏡了。
    任何語言的字元揉在一起都像一團螞蟻,而兩種語言結合起來使用就能夠鮮明地區別開來,這樣我們一眼掃過便可輕鬆明白引數的使用位置和意義。

  4. 在VisualStudio的智慧感知提示中與.Net框架內容區別開來。
    漢字雖不受智慧感知輸入支援,但他們都乖乖地堆在智慧感知提示列表最底端,這使得我們可以很方便地找到我們自定義的內容:

    而我們如果用規範的英文命名的話,我們自定義的內容就會散落到整個列表的各處,極易與.Net框架內建的內容混淆,尤其是當我們無法確切記住其命名時,在這列表裡找想要的內容就如同是微縮版大海撈針。

所謂的缺陷

解釋一些易產生的質疑:

  1. 中文輸入慢。
    很早以前五筆就已超越英文輸入速度了,而現今拼音輸入法的速度也大幅提升,中文輸入的速度應該是比英文更快才對,至少我是這樣認為的。
  2. 無法享受VisualStudio智慧感知輸入支援。
    如果你痛恨滑鼠流,硬要通過鍵盤輸入在智慧感知列表中迅速定位中文程式碼的話,也是可以的,不過就得用這個權宜之策了:在中文命名前追加拼音首字母。比如將“幫助”改為“b幫助”,或“全域性配置”改為“qj全域性配置”。
    期待微軟在智慧感知列表中加入拼音支援……儘管很渺茫……
  3. 中文命名過長導致檔案增大、呼叫遲緩。
    這個嘛,姑且不談中文、英文哪個更精簡。其間的差異無論是從檔案尺寸還是呼叫速度上來說,都是微乎其微的;並且你完全可以在專案編譯後對其實施混淆,把命名全改為a b c d e嘛,這樣還會有什麼問題嗎?

真正的缺陷

 一些不可否認和忽視真正缺陷:

  1. 輸入法開閉狀態不易把持。
    雖然輸入法的英漢切換很方便,但最大的問題是使用者往往無法記住自己當前的狀態,從而經常導致因弄錯狀態而輸入錯誤內容,這是用中文寫程式碼時非常頭痛的問題。
  2. 不適合國際化交流。
    如果你們的開發團隊中有外籍人員,或你想將自己的程式碼在全世界開源分享,那麼使用中文顯然是不合適的。

結語

還是那句話,語言就是工具而已,不同的人喜歡不同的工具,適合自己的就是最好的。

————————————————————————————————————————————

給所有人的回覆:

有些人會錯我的意思了,我沒有佔據什麼道德制高點,我說的是歧視用中文程式設計的人不尊重漢語,而不是說不贊成用中文程式設計的人,這是有區別的。

文中我也說了,語言就是工具而已,適合自己的就是最好的,每個人的習慣、工作環境不同,需求也就不同,強求是沒有意義的,所以你用英文、拼音、中文、混合使用都無所謂。可以各執己見,可以交流探討各自優劣點,但不該歧視、攻擊。

有人說穿插中文命名的示例程式碼會誤導初學者,讓他們以為學英文沒必要,我覺得還沒那麼容易就誤導了誰,該學的總會學,不願學的還是不學,個人有個人的需求了。

而且,反過來說,大家想想印度為何軟體發展如此迅猛呢?因為他們官方語言為英語,普通民眾覺得程式設計就像說話那麼簡單,從而產生興趣,繼而成為職業。我們以母語來做示例,打破高牆,也許也會讓更多國人從此跨入程式設計之門,這不是更好地達成分享知識的目的嗎?(有人列舉了日本Ruby使用英文的例子,這個很好理解,日本基本人人英文都很好,而日語和英語都沒什麼使用障礙的話,肯定是選英語更為通用些。日本人不會為了民族情感而犧牲實用性,我們也不該為了中文而中文,凡事有度,適用為上)

還有人指責中文的介面在國際上不通用的問題,這個我在文中早就說了中文寫程式碼不適合國際化應用,並且介面本身就應該是個通用的東西,你完全可以中文寫類,英文寫介面呀,這更能體現介面的本來意義吧。就像USB介面一樣,別管美國產的、中國產的東西,符合介面就可以插,仿製個長信宮燈插上都沒問題,所以中國廠商即使所有材料、工藝都是中國的,也會使用這個介面來保證裝置通用性,而不是自定義一個有中國特色的社會主義USB介面。