最近有段十分流行的代码,是从江湖传闻“身怀八蛋”的铁道部发言人王勇平同志的一句名言:“不管你们信不信,我反正信了……这是生命的奇迹……它就是发生了”所引申出来的。这段代码虽然只是在调侃,但是围绕这段代码也产生了一些讨论(如代码风格,编程规范等等),在此顺手记录一下,就当无聊罢。

这段代码是这样的:

try
{if (you.believe(it) == true || you.believe(it) == false){I.believe(it);}
}
catch (Exception ex)
{throw new Exception("It's a miracle!");
}
finally
{it.justHappened();
}

代码与原文的对应关系不言自明,从命名风格上看,我们默认其为Java代码。话题主要是围绕在if条件的写法上。

书写风格

先来看看它的书写风格问题。我说这段代码不是老鸟写的,因为老鸟不会把一个布尔表达式跟true和false直接判断,而会写成:

if (you.believe(it) || !you.believe(it))

于是有朋友提出,把布尔表达式跟true或false相比较来的更清晰一些,我表示这话并没有什么道理,因为这种读代码的方式是把视角停留在“数据”层面上:一个布尔表达式返回了布尔型的“数据”,于是把它和另外一个“数据”进行比较。如今的编程都在不断强调“语义”,“语义”的清晰才是真的清晰。我说Java是一门糟糕的语言,主要原因就是指它的表达能力太差,导致写出来的代码体现不出问题的解决方式,让人们把目光都集中在具体每条语句上了,所谓“见木不见林”。C#等现代语言都在强调“做什么”而不是“怎么做”,语义上就有很大提高了。

回到目前这个具体问题上,if里面的语义是“you.believe(it)”的返回结果,而不是它的值与另外一个布尔常量的比较结果。其实这个观点我从初中搞信息学竞赛时就被老师不断强调,今天我同样咨询了同事,他也赞同我的观点。如果您还继续坚持这种写法不太清晰的话,我只能说“这只是不适应而已,要让自己适应这类写法”,很多人还觉得LINQ不清晰呢,小学生还觉得高中数学的解法不清晰呢。

还有朋友认为,作为编码规范,应该要求这么写,例如:

if (10 == i)

就是说,把常量写在比较操作的左边,并认为“这样更有普遍意义”。其实这也没有必要,这个习惯是从C语言时代遗传下来的“陋习”。在C语言里,如果把常量写在比较右侧,并且一不小心把“比较”操作符(两个等号)写成“赋值”操作符(一个等号),也可以编译通过,但是结果却大不相同,这给错误排查也会带来许多麻烦。但是,在如今的语言里已经比C语言做的安全多了,所以没必要制定这种规范。把一种语言的标准带入另一种语言不叫做“有普遍意义”,只是多余。

代码含义

然后要谈的便是代码与那句话的“映射”关系了,再来仔细读一下这个if子句:

if (you.believe(it) || !you.believe(it))
{I.believe(it);
}

从“需求”上来理解,我认为代码应该保证if内部的代码一定会执行。那么现在这个需求肯定会满足吗?不一定,因为you.believe方法可能是有副作用的:如果它第一次调用返回false,而第二次调用时返回true,则if内部的代码就会整段略过,这显然不是铁道部王发言人的意图。因此,有同学提议代码应该是这样的:

if (true || you.believe(it))

这么做的确可以忽略you.believe(it)的结果,因为它已经被短路了根本不会执行。可能它也能满足需求,但我想更合理的做法可能应该是:

if (you.believe(it) || true)

这段代码与之前的区别就在于you.believe(it)一定会被调用一次,但是无所谓其结果是如何,这充分符合天朝某些部门喜欢装摸作样“咨询民意”的状况。

扩展思考

最后再来一道扩展思考题吧:有人把“你爱,或者不爱我,爱就在那里,不增不减”写成了一段C#代码:

if (you.Love(me) || !you.Love(me))
{love++;love--;
}

有人说,这段代码的if条件本身应该被编译器优化掉,因此会直接执行if内部的代码。还有人说,if内部的代码也会被编译器优化掉。您怎么看,为什么呢?

2011年度最佳代码“不管你们信不信,我反正信了”相关推荐

  1. 年度最佳代码“不管你们信不信,反正我信了”

    最近有段十分流行的代码,是从江湖传闻"身怀八蛋"的铁道部发言人王勇平同志的一句名言:"不管你们信不信,反正我信了--这是生命的奇迹--它就是发生了"所引申出来的 ...

  2. AQA 2011年度最佳博客

    AQA 2011年度最佳博客: http://www.automationqa.com/uchome/space.php?uid=1&do=blog&id=526

  3. 2011年度最佳10款免费的 WordPress 主题

    这篇文章与大家分享2011年度最佳10款免费的 WordPress 主题,这些漂亮的主题可以免费下载使用.WordPress 是一个功能非常强大的博客系统,插件众多,易于扩充功能,安装和使用都非常方便 ...

  4. 2011年度最佳 jQuery 插件发布

    近日,国外著名博客WDL发布了2011年度最佳 jQuery 插件.jQuery 自2006年发布以来,经过五年的迅速发展,目前已是最流行和使用最广泛的 JavaScript 框架.jQuery 的易 ...

  5. 让人期待的2011年度最佳 jQuery 插件发布啦

    近日,国外著名博客WDL发布了2011年度最佳 jQuery 插件.jQuery 自2006年发布以来,经过五年的迅速发展,目前已是最流行和使用最广泛的 JavaScript 框架.jQuery 的易 ...

  6. 不管你们信不信,反正我信了

    谈谈年度最佳代码"不管你们信不信,反正我信了" 2011-08-05 15:15 by 老赵, 7916 visits 最近有段十分流行的代码,是从江湖传闻"身怀八蛋&q ...

  7. 不管你信不信,反正我信了。是这样实现的……

    生活中的东西,都是可以用程序来模拟实现的.     今天code陈问我这样一个问题:             用程序表示"你回来了,你回来了我很高兴!"这句话.           ...

  8. CI这点事,主要靠测试(TestCase)。CI这点事,也不能靠测试(测试Team)。不管你信不信,反正我相信!

    CI这点事,主要靠测试(TestCase).CI这点事,也不能靠测试(测试Team).想作CI的软件Team就要花精力做自己的TestCase,作不了Unit test,尽可能写一些能卡住问题的脚本也 ...

  9. 2011年度最佳开源软件:Bossie奖结果公布

    编者按:Bossie奖是知名英文IT网站InfoWorld针对开源软件颁发的年度奖项,根据这些软件对开源界的贡献,以及在整个业界的影响力评判获奖对象.如今,开源软件已经无所不在,今年又有哪些开源软件对 ...

最新文章

  1. 数组的有关属性和方法
  2. 解决.gitgnore加入.idea无效问题
  3. 苹果MacOS系统上安装第三方驱动失败/无效
  4. 持续集成部署Jenkins工作笔记0001---持续集成、持续部署、持续交付的概念
  5. python和java学哪个好-Python VS Java,学哪个更有前途?
  6. 怎样覆盖之前的html文档,jquery – html文本覆盖自己
  7. 【资源汇总】超全整理深度学习相关学习资料,提供系统化的深度学习路径
  8. 基于 Multiple Teacher Single Student 框架的多领域对话模型
  9. 计算机毕业设计之java+ssm的图书管理系统的设计与实现论文
  10. Python实现修改图片尺寸
  11. SSL证书错误了怎么办?
  12. [转]94个比付费软件更好的免费软件
  13. CSS 实现炫酷的动态背景效果
  14. leetcode 39. Combination Sume (medium)
  15. 穿山甲 groMore 配置广告位 穿山甲/优良汇
  16. 一、【s3c2440移植linux-3.5】移植准备
  17. A Game of Thrones(101)
  18. 工业机器人与视觉实训平台
  19. EXP-00002错误解决方法
  20. 抓娃娃机按钮按几下_揭秘娃娃机抓娃娃技巧全攻略

热门文章

  1. 【转】WCF Data Service 使用小结(二) —— 使用WCF Data Service 创建OData服务
  2. 【转】可道云kodexplorer搭建私有云后的配置优化
  3. JAVA 捕获异常所遇BUG
  4. 类似ajax封装函数,JS 封装一个async式的AJAX函数
  5. CCIE理论-第一篇-SDN概念复习
  6. CCNP-第十四篇-BGP综合实验
  7. 【人工智能课程实验】 - 利用贝叶斯分类器实现手写数字 的识别
  8. *【牛客 - 326B】背单词(线性dp)
  9. 1.How Models work
  10. 格式说明_ISO11784/85 FDX-B动物芯片格式写码说明