程序員有一個經典笑話:XX語言是世界上最好的語言。然后大家可以爭論到明天早上。程序員真的是分派別的,怎么分?你最先熟悉的,最先使用的編程語言,就是你的編程的母語。這種母語影響將是根深蒂固,潛移默化的,哪怕后來又學了別的語言,例如C++程序員轉成了C#程序員,或者轉成JAVA的,一個有趣的現象是,在哪些母語就是C#的程序員眼里看那些轉行程序員的代碼,即使看起來也可以編譯,語法正確,也可以運行,但從代碼層面也可以明顯的看出各種區別
所有人都有母語,例如看這個文章的你,我猜9成的可能性母語是中文,OK,那么你就會很容易的理解我下面說的東西。當人還是一個嬰兒時,學習的語言是與身俱來的能力,1歲時就會聽,3歲時就會講,會交流,然后哪怕30歲,50歲,當我們學習,思考,哪怕是心中默默的自言自語,用的語言都會是母語。即使花了很長期的努力學習一門外語,在中國最多的就是英語或者日語,天天努力的練習,交流,但是也很難改變母語對我們的那些根深蒂固的影響。
舉例來說,中文說好久不見,英文的標准表達是Haven't seen you for a while或者It's been a long time sine we met last time。按中國人的chinenglish的說法就變成了Long time no see。現在中國強大了,老外也開始接受這種說法,甚至美劇里老外也會這么說,
而在編程的領域,我覺得也存在着這一現象。今天我就以C#為例,來說說那些偽C#程序員寫的“假代碼”……
實例一:轉義字符串寫法
1 String str1 = @"C:\Windows"; 2 String str2 = "C:\\Windows"; 3 String str3 = @"This is my little brother, George. 4 This is Mummy Pig. 5 And this is Daddy Pig. 6 Peppa pig. 7 Muddy Puddles. 8 It is raining today. 9 So, Peppa and George cannot play outside. 10 Daddy, it's stopped raining. 11 Can we go out to play? 12 Al right, run along you two. 13 Peppa loves jumping in muddy puddles. 14 I love muddy puddles. 15 Peppa. If you jump in muddy puddles, you must wear your boots. 16 Sorry, Mummy."; 17 String str4 ="This is my little brother, George."+ 18 "This is Mummy Pig."+ 19 "And this is Daddy Pig."+ 20 "Peppa pig."+ 21 "Muddy Puddles."+ 22 "It is raining today."+ 23 "So, Peppa and George cannot play outside."+ 24 "Daddy, it's stopped raining."+ 25 "Can we go out to play?"+ 26 "Al right, run along you two."+ 27 "Peppa loves jumping in muddy puddles."+ 28 "I love muddy puddles."+ 29 "Peppa. If you jump in muddy puddles, you must wear your boots."+ 30 "Sorry, Mummy.";
str1是C#中推薦的寫法,因為更接近日常使用。各種轉義字符不需要再添加轉義符。str2更接近C++或者Java的寫法,直接Copy過去用也可以。再看str3和str4,C#有了@的語法后,除了解決轉移符的問題外,還順便解決了換行寫法的問題。str4是在Java中的很常見到的寫法,在C#也可以這么寫,但是會暴露你偽C#程序員的身份。
實例二:Nullable
這個實例說的是各個語言里都有自己的特有語法,一個語言不同於其他語言的特質就是它有別於其他語言的語法。一般為了推廣,一些通用語法也會保留,但會推薦你一些高級語法,會不會用這些語法,很容易區別真假C#程序員。
例如下面這個例子:nullable是C#里一個很獨特的設計,解決數據從數據庫讀取后,有可能為null的情況,即數據的情況有兩種,有值或者null。在實際處理時經常要對null值進行特殊處理,給予賦值,為了簡化三目運算符的操作就有了??這個操作符。
//三目運算通用寫法:適用於Java,C++等 num3 = num1==null?num1:5.34; //C#專用寫法 num3 = num1 ?? 5.34;
實例三:循環寫法
循環是各種語言里都有的基本語法控制結構,從這個結構里,也可以看到各種語言設計者的偏好,當然從程序員的代碼里就可以看出他的母語是哪一種,甚至可以看的出程序員學習寫代碼年代。
//JS寫法: for(i in n) { n[i]=0; } //Java或C++寫法 for(int i=0;i<10;i++) { if(n[i]==null)n[i]=0; } //C#寫法: foreach(var item in n) { if(item)item=0; }
//JS ES6寫法:
for(p of n)
{
p=0;//這里請注意同上面的JS寫法不同的是這里的p就相當於上面的n[i] }
首先說JS的寫法,循環變量無需設定類型,其實JS里for循環用的都已經不多了,更常見的寫法是Lamdba的寫法。
C++寫法是原始寫法,按這個寫法在別的語言里基本都可以通用的Copy代碼過去用。
C#寫法引入了foreach寫法,這種寫法在之后也開始被別的語言引入,JS里有List.forEach((p)=>{return p>5;})等改進版。
實例四:Model定義語句
//C#的Model類定義:標准版 public class Test { public string Name{get;set;}; public int Age{get;set;} } //C++的Model定義 class Test { public string name; public int age; }; //JAVA的Model定義 public class Test { public string name; public int age; string getName() { return this.name; } void setName(string name) { this.name=name; } int getAge() { return this.age; } void setAge(int age) { this.age=age; } }
在C#中如果使用Java的寫法也都是可以通過的,但用C#專有的寫法明顯可以起到事半功倍的效果。
JAVA的語法其實也支持如同C++一樣的類定義的寫法,可是實際使用中,一旦涉及get,set操作,就需要一個個的寫方法,雖然很多IDE可以幫助自動添加了,可是只從看代碼的角度上,有點冗長。也有些組件插件可以支持不需要寫get,set方法,但畢竟不是基礎的支持。
實例四:新構建一個類
//Java寫法 public class Platypus { String name; Platypus(String input) { name = input; } Platypus() { this("John/Mary Doe"); } public static void main(String args[]) { Platypus p1 = new Platypus("digger"); System.out.println(p1.name); } } //C#寫法 public class Platypus { String name{get;set;}; } public static void Main(String args[]) { Platypus p1 = new Platypus{
name:"digger"
}; }
以上可以明顯的看到C#里可以不寫構造函數,直接給成員變量賦值生成實例,大大的減少了代碼的量(如果這個類只被用到一兩次的話)。這個寫法其實更常見於JS的語法,很多初級的C#程序員都不怎么會用。
OK,其實如果再往下舉例,我們還可以有許許多多的例子。在這里我並不想說C#有多高級,似乎語法上比其他語言簡潔很多,多年的編程實踐告訴我並不是這樣的。現在后台服務器編程領域,JAVA,C#是主流,它還在吸收各種先進的語法來完善自己。前端JS和后端的Node開發都使用統一的js語法,而js的語法更是一年一個樣,三年就是一個大Gap了。從一個更長的時間維度上來看,各家語言也都在實時的發展中。例如JAVA開始引入Lamdba的寫法,JS的標准一年年在進化,promise等等新語法被融入。一個長期的趨勢就是各種優秀的編寫語法會從一個語言被引入到另一個語言,各個語言最終會越來越趨同。現今學習一門新語言的難度(從JAVA轉Node(js)或者C#轉JAVA)要遠遠小於10年前或者15年前,當時VB編程和C++編程的年代(從VB轉C++),兩者的語法很少有我今天舉的這些個例子,區別遠遠的大很多。突然發現有點跑偏,此處留個伏筆,下次專門寫一篇編程語言語法趨同,學習用通用語法寫代碼的文章,做一個會小無相神功的程序員。
在此,不想對編程語言有太多的評判,只想說,不論你現在使用的是什么編程語言,要好好用它,特別是一些高級語言特性和它新融入的語法,讓那些原生程序員感覺你不是個外國人,高級語法都有其特定的語法價值,可以提高很多的效率。不是會寫for循環就會寫代碼的,在真正的高級程序員眼中,你寫出來的都只是披着別的語言語法的假代碼。
