在原生程序员眼里,可能你写的是假代码……
程序员有一个经典笑话: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循环就会写代码的,在真正的高级程序员眼中,你写出来的都只是披着别的语言语法的假代码。