René's profile一九八四PhotosBlogGuestbook Tools Help

Blog


    July 28

    码农日记2:Clever, But Difficult

     

    在书写拥有科学发展观和先进性代码的感召下,我在最近给系统工程团队写一个小程序的时候极尽变态之能事,把这个程序写得骈四俪六。连100多个单元测试都自我感觉很有美感,覆盖很丰富,且无重复和多余。


    于是我斗胆去找史上最恶毒的代码审核者荷兰的人范德瓦特老师来审核。范德瓦特老师是审核代码的楷模,就像那些职业的挤柠檬的运动员,或者黄世仁的管家穆仁智一样。我经常想,如果各个码农都像他一样,这个世界所有二进制的东西一定会很美好。


    一,

    范德瓦特:这个参量如果是空字符串,那么在这里会抛出异常。

    杨德瓦片:我知道啊,但是我就想让空字符串的话抛出这个异常,也有个测试在测这个。

    范德瓦特:但是是在这个方法的第7行,由一个.Net Framework的类抛出来的。

    杨德瓦片:嗯哪,但是前6行并没有任何代码产生副作用(side effect)。这和我自己在开始去检查了然后去抛这个异常没有任何区别。

    范德瓦特:有区别。如果万一有一天我手贱,动了这个方法的前6行,就有区别了......

    杨德瓦片:好,哥,我错了,我错了还不行么?

    范德瓦特:不要迷恋哥,哥只是个传说。

    杨德瓦片:那我在第一行加个条件检测一下。

    范德瓦特:那不够好。

    杨德瓦片:那什么够好?

    范德瓦特:你应该用契约(Contract)之类的东西就完美了。你知道我们在上个项目产品开发里面用过。

    杨德瓦片心想:爷就是做形式化方法的,跟我讲契约式设计(Design by Contract)......

    杨德瓦片:嗯,但是我知道产品里居然有两种不同的很自我很重复的契约式设计的实现。最扯淡的是,那俩贱人把它们都写进了产品的服务进程的程序里面。你总不想让我把产品的服务进程的dll文件放到我这个八竿子打不着的小工具里吧。

    范德瓦特:你可以自己写一个。那两个其实很瘸。

    杨德瓦片:但是微软有Code Contract了,现在号称可以用了;VS2010就可以大胆用了。

    范德瓦特:年轻人,不要那么懒。


    二,

    于是我自己写了一个简单的契约的实现。又叫来了范德瓦特。

    范德瓦特:靠,你还用Generic

    杨德瓦片:嗯,不能在契约方法中抛自定义的异常很不爽,你不是说他们很瘸了么......

    范德瓦特:靠,你还用Reflection

    杨德瓦片:嗯,没有办法,因为我用了Generic的异常,不Reflection我怎么生成对象?请问,你有对象么?

    范德瓦特:(无语)


    三,

    范德瓦特:谁告诉你“要求”(require)对应“前提”(pre-condition),“保证”(ensure)对应“后置条件”(post-condition)的?

    杨德瓦片:波特兰梅耶尔在书上这么来的。你不相信我,你得相信叫波特兰的,一般敢叫这个名字的都有点斤两。

    范德瓦特:算你狠。但是你的“要求”,“保证”,以及“断言”(assert)在这里的实现有多大区别。

    杨德瓦片:暂时没太大区别,但是以后会有很大区别,跟真的一样。我还要做“不变量”(invariant)

    范德瓦特:想到以后很好,但这次你想太多了......以后的事情以后再说,放在这里太吓人。万一他们以为你真的都实现了咋办。

    杨德瓦片:好,哥,我错了,我错了还不行么?我马上就删了,我就用“要求”,留这个就够了。

    范德瓦特:不行,不是所有人都知道形式化方法、分得清那么多的。但是这里人人都知道“断言”。

    杨德瓦片:点点点

    范德瓦特:什么?

    杨德瓦片:我说好。但是我迟早把它改了......因为在契约式设计的一般概念里,“断言”一般不会在release模式下开启的,只在debug时专门做运行时检测(runtime verification)时才会检测。

    范德瓦特:我支持你以后重构(refactoring),不过要等你让其他人都知道概念上的区别。但是现在只能如此。

    杨德瓦片:嗯。不过我要把这个实现放在单独的dll里,这样人人都可以用。

    范德瓦特:你是要让那两个人知道他们的实现很瘸?

    杨德瓦片:那不好么?

    范德瓦特:那太好了。


    四,

    范德瓦特:你这个方法命名不应该用第三人称单数。


    五,

    范德瓦特:哈哈哈

    杨德瓦片:咋了?

    范德瓦特:你给契约写的单元测试覆盖了所有抛出异常的情况,但是没有测第一行条件满足之后正常返回的情况。

    杨德瓦片:你是说让我写两个测试保证1+1==2

    范德瓦特:是,如果万一有一天我手贱......

    杨德瓦片:。。。。。。

     

    六,

    范德瓦特:我说了多少遍了,你丫能不能把你那个测试用的虚拟机的名字改了,明知道尼采(Nietzsche)不好拼。

    杨德瓦片:好,我一会就把它改成叔本华(Schopenhauer)


    七,

    范德瓦特老师在仔细得数changelist里面的文件数目,生怕我多放一个文件到代码控制服务器上。于是我这会很无聊。

    杨德瓦片:你知道么,其实我特别高兴用契约式设计,我原来是折腾这些的。

    范德瓦特:嗯

    杨德瓦片:如果我把我的契约实现添加自动生成单元测试的功能,那就牛x了,甚至可以发篇学术期刊了。

    范德瓦特:嗯,好

    杨德瓦片:要是再有个建模和自动模型检测的工具就完美了......(自我陶醉中)

    范德瓦特:你要没事干帮我倒杯水......


    七,

    范德瓦特:哈哈,又一个拼写错误。


    八,

    饭后,我打探消息归来。

    杨德瓦片:你知道么,xxx团队做了一个号称完全实现契约式设计的库。

    范德瓦特:我@##%@#

    杨德瓦片:这就是我多次提出的我们和他们缺乏交流。我们在同一个楼里,做了4种不同的实现。而且还仅仅是我们两个团队,还不算其他那么多团队。还有美国的,加拿大的,澳大利亚的,德国的,日本的......而且大家都知道,有一天我们会都在VS2010里面用微软的Code Contract的。

    范德瓦特:主要是很多人很聪明,但是和他们交流却很困那。

    杨德瓦片:所以我每天都尽量和比较不聪明的人说话。

    范德瓦特:#@%#%#%#

    Comments (2)

    Please wait...
    Sorry, the comment you entered is too long. Please shorten it.
    You didn't enter anything. Please try again.
    Sorry, we can't add your comment right now. Please try again later.
    To add a comment, you need permission from your parent. Ask for permission
    Your parent has turned off comments.
    Sorry, we can't delete your comment right now. Please try again later.
    You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
    Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
    Complete the security check below to finish leaving your comment.
    The characters you type in the security check must match the characters in the picture or audio.

    To add a comment, sign in with your Windows Live ID (if you use Hotmail, Messenger, or Xbox LIVE, you have a Windows Live ID). Sign in


    Don't have a Windows Live ID? Sign up

    beaa Liwrote:
    没看懂,还是1比较适合非专业人士
    July 29
    LIU Yuanwrote:
    杨德瓦片........
    July 29

    Trackbacks

    The trackback URL for this entry is:
    http://renepapa.spaces.live.com/blog/cns!376D1BA2D144EC97!713.trak
    Weblogs that reference this entry
    • None