image 我近期经常放出一些用中文写的类库、代码,总会招致围观,搞得我跟动物园里新来的稀有动物似的。

围观众人中有些朋友表示支持,有些朋友则不屑,甚至鄙夷,在这个MVP候选人公告中,更是有人这样评价我:

#46楼 61.172.247.*  2009-07-27 13:59  choudan[未注册用户]

看到第一位,我有点惊讶。
http://skyd.cnblogs.com/
看到中文类名、方法名、属性名,我有一种想砸电脑的感觉。。。。。
这样的编码也能评上MVP候选?

我们姑且笑而置之,我的确没什么高深的技术,但这和用中文写代码没有任何联系,从中不难看出,有些人觉得用中文写代码就是不入流的、没水准的、龌龊的、低俗的。我只想问这些人一句话:你尊重你的母语——汉语吗?

正名

人无贵贱,语言更是没有优劣之分。没有任何人敢说英语是最优秀、最高贵的语言,其他都是劣等语言;也没有任何人曾说过写程序必须用英文(也许你说过,我没听过)。

嘲笑用中文写程序,就像是C#程序员看不起VB程序员一样,殊不知其实语言仅仅是工具而已呀。

你拿着关老爷的大刀别人会心生畏惧,这个工具很威风,但你半天砍不死只鸭子,这只会让旁人笑得比关老爷脸还红。

相比工具而言,人们更在乎你能做什么;就像武侠小说里,大侠手中草木皆兵刃,小喽啰的利剑弄不好还伤了自己;十八般兵器,用什么看你自己的喜好,能耍成什么样则要看你自己的本事。

用什么语言说话,怎可用于衡量一个人的贵贱?用什么语言编写代码,又怎能用以衡量一个程序的优劣?

有道是“存在即合理”,在某些人唏嘘之前,不妨先看看中文写代码有什么切实的好处吧:

优点

  1. 易于理解。
    咱们这些人中虽然不少人英文不错,但总也不如母语理解起来自然、高效、准确吧?
    有些人英语一般,就通过查词典写出了一堆不伦不类的英文命名,数日后再看自己的代码,又要去查词典,这自己麻烦不要紧,权当学英语了,问题是这代码拿去给别人看,人家一看就头大。这时如果直截了当地使用中文命名,不就什么问题都解决了吗?
    并且中文命名还可以显著减少代码注释,降低代码阅读难度。
    试读这段代码(我的英文水平很烂,所以我就是只能通过查词典来写出不伦不类的命名):

    /// <summary>

    /// 执行充值,并返回是否成功

    /// </summary>

    public bool RunSupplement(DatabaseEntities c)

    {

        if (Verify(this)==true)

        {

            this.UsedTime = DateTime.Now;

            this.UsedUser = Membership.GetUser().UserName;

            var p= UserProfile.GetUserInfo(this.UsedUser);

            p. SupplementPoint += this.Value;

            p.Save();

            c.SaveChanges();

            return true;

        }

        return false;

    }

    再试读这段代码:

    /// <summary>

    /// 执行充值,并返回是否成功

    /// </summary>

    public bool 执行充值(DatabaseEntities c)

    {

        if (检验有效性(this)==true)

        {

            this.使用时间 = DateTime.Now;

            this.使用用户 = Membership.GetUser().UserName;

            var p= UserProfile.获取用户信息(this.使用用户);

            p.充值点数 += this.面值;

            p.Save();

            c.SaveChanges();

            return true;

        }

        return false;

    }

    哪个理解起来更轻松?
    在这里,代码本身其实就像是一段注释,不是吗?你还要坚持用英文写程序,而在字里行间穿插中文注释吗?
    另外,我不知道各位初学程序时看到代码是什么感觉,我当时感觉那堆代码就是天书、就是密码,尤其是当我连关键字、类、属性、方法等等的概念还没有的时候,那些简直是不可理解的东西,这些代码就像是程序员的“黑话”,让外行人犯晕。而假如我们的示例代码都穿插中文命名的话,是不是可以便于新手理解、降低门槛、打破神秘感呢?
    此外,出于同样的原因,InfoQ中也有这样一篇文章推荐使用中文命名测试方法:
    image

  2. 在英文代码之间清晰可辨。
    在英文代码中加入中文,就如同在羊群中加入奶牛一样,你总能一眼找出你加进去的东西。
    当我们需要重新审视一个方法的参数的功能时,你会发现使用中文为参数命名是绝佳的做法。
    还是先来看看咱的烂英文写出的方法:

    public static Image CutImage(Image Image, Point StartPoint, Size CutSize)

    {

        Bitmap resizedBmp = new Bitmap(CutSize.Width, CutSize.Height);

        Graphics g = Graphics.FromImage(resizedBmp);

        g.DrawImage(Image, new Rectangle(0, 0, CutSize.Width, CutSize.Height), new Rectangle(StartPoint.X, StartPoint.Y, CutSize.Width, CutSize.Height), GraphicsUnit.Pixel);

        return resizedBmp;

    }

    这样一小坨代码虽然很简单,但你要找到参数被使用的位置还是有点头疼的,而如果它们变成“奶牛”的话……

    public static Image 剪裁图像(Image 图像, Point 起始坐标, Size 剪裁尺寸)

    {

        Bitmap resizedBmp = new Bitmap(剪裁尺寸.Width, 剪裁尺寸.Height);

        Graphics g = Graphics.FromImage(resizedBmp);

        g.DrawImage(图像, new Rectangle(0, 0, 剪裁尺寸.Width, 剪裁尺寸.Height), new Rectangle(起始坐标.X, 起始坐标.Y, 剪裁尺寸.Width, 剪裁尺寸.Height), GraphicsUnit.Pixel);

        return resizedBmp;

    }

    如果你还觉得找起来费劲的话就得配花镜了。
    任何语言的字符揉在一起都像一团蚂蚁,而两种语言结合起来使用就能够鲜明地区别开来,这样我们一眼扫过便可轻松明白参数的使用位置和意义。

  3. 在VisualStudio的智能感知提示中与.Net框架内容区别开来。
    汉字虽不受智能感知输入支持,但他们都乖乖地堆在智能感知提示列表最底端,这使得我们可以很方便地找到我们自定义的内容:
    image
    而我们如果用规范的英文命名的话,我们自定义的内容就会散落到整个列表的各处,极易与.Net框架内建的内容混淆,尤其是当我们无法确切记住其命名时,在这列表里找想要的内容就如同是微缩版大海捞针。

所谓的缺陷

解释一些易产生的质疑:

  1. 中文输入慢。
    很早以前五笔就已超越英文输入速度了,而现今拼音输入法的速度也大幅提升,中文输入的速度应该是比英文更快才对,至少我是这样认为的。
  2. 无法享受VisualStudio智能感知输入支持。
    如果你痛恨鼠标流,硬要通过键盘输入在智能感知列表中迅速定位中文代码的话,也是可以的,不过就得用这个权宜之策了:在中文命名前追加拼音首字母。比如将“帮助”改为“b帮助”,或“全局配置”改为“qj全局配置”。
    期待微软在智能感知列表中加入拼音支持……尽管很渺茫……
  3. 中文命名过长导致文件增大、调用迟缓。
    这个嘛,姑且不谈中文、英文哪个更精简。其间的差异无论是从文件尺寸还是调用速度上来说,都是微乎其微的;并且你完全可以在项目编译后对其实施混淆,把命名全改为a b c d e嘛,这样还会有什么问题吗?

真正的缺陷

 一些不可否认和忽视真正缺陷:

  1. 输入法开闭状态不易把持。
    虽然输入法的英汉切换很方便,但最大的问题是用户往往无法记住自己当前的状态,从而经常导致因弄错状态而输入错误内容,这是用中文写代码时非常头痛的问题。
  2. 不适合国际化交流。
    如果你们的开发团队中有外籍人员,或你想将自己的代码在全世界开源分享,那么使用中文显然是不合适的。

结语

还是那句话,语言就是工具而已,不同的人喜欢不同的工具,适合自己的就是最好的。


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

给所有人的回复:


有些人会错我的意思了,我没有占据什么道德制高点,我说的是歧视用中文编程的人不尊重汉语,而不是说不赞成用中文编程的人,这是有区别的。


文中我也说了,语言就是工具而已,适合自己的就是最好的,每个人的习惯、工作环境不同,需求也就不同,强求是没有意义的,所以你用英文、拼音、中文、混合使用都无所谓。可以各执己见,可以交流探讨各自优劣点,但不该歧视、攻击。

有人说穿插中文命名的示例代码会误导初学者,让他们以为学英文没必要,我觉得还没那么容易就误导了谁,该学的总会学,不愿学的还是不学,个人有个人的需求了。


而且,反过来说,大家想想印度为何软件发展如此迅猛呢?因为他们官方语言为英语,普通民众觉得编程就像说话那么简单,从而产生兴趣,继而成为职业。我们以母语来做示例,打破高墙,也许也会让更多国人从此跨入编程之门,这不是更好地达成分享知识的目的吗?(有人列举了日本Ruby使用英文的例子,这个很好理解,日本基本人人英文都很好,而日语和英语都没什么使用障碍的话,肯定是选英语更为通用些。日本人不会为了民族情感而牺牲实用性,我们也不该为了中文而中文,凡事有度,适用为上)


还有人指责中文的接口在国际上不通用的问题,这个我在文中早就说了中文写代码不适合国际化应用,并且接口本身就应该是个通用的东西,你完全可以中文写类,英文写接口呀,这更能体现接口的本来意义吧。就像USB接口一样,别管美国产的、中国产的东西,符合接口就可以插,仿制个长信宫灯插上都没问题,所以中国厂商即使所有材料、工艺都是中国的,也会使用这个接口来保证设备通用性,而不是自定义一个有中国特色的社会主义USB接口。


posted on 2009-08-18 00:08  斯克迪亚  阅读(12358)  评论(308编辑  收藏  举报