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

这段代码是这样的:

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

书写风格

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

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

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

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

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

代码含义

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

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

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

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


扩展思考

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

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

————

编辑 ∑Gemini

来源:算法数学之美

☞泰勒定理的奇闻轶事

☞丘成桐:漫谈微分几何

☞Leibniz 如何想出微积分?(一)

☞线性相关和秩的物理意义

☞数学史上你认为最丑陋的公式是什么?

☞陶哲轩谈什么是好的数学

☞田渊栋:数学的用处(下篇)

☞你绝对没想过原来数学家这么流氓,一言不合就进行暴力证明

☞世界上最牛的五篇博士论文

☞数学中有哪些巧合让人眼前一亮?

☞算法立功!清华毕业教授美国被抢车,警察无能为力自己用“贪心算法”找回

☞学术史上的奇文:怎样用数学抓狮子

☞台大教授的反思:最难的一课 我们却没教给学生

☞麻省理工学院(MIT)研究生学习指导—— 怎样做研究生

☞分享 数学,常识和运气 ——投资大师詹姆斯·西蒙斯2010年在MIT的讲座

算法数学之美微信公众号欢迎赐稿

稿件涉及数学、物理、算法、计算机、编程等相关领域,经采用我们将奉上稿酬。

投稿邮箱:math_alg@163.com

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

  1. 项目说事——信不信反正我信了(合作开发总结之文档)

    信不信反正我信了.这句话让我很无耐啊,是啊经历过合作开发的程序猿应该都有着同感--无耐.项目开发应该是件高兴的事,挣钱嘛.工作经验啊谁不高兴,可是问题又来了,以前只是个人开发项目啊,文档好歹写写,图好 ...

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

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

  3. 据说是11年度最佳代码

    try {     if(you.believe(it)  || !you.believe(it) ){         I.believe(it);     } }catch(Exception e ...

  4. 言简意赅告诉你KMP算法的原理,不管你信不信,我信了

    我们以一个非常简单的例子来开头,举例主串为abababc,模式串为abc,在我们进行匹配的时候第一次匹配的效果为 abababc ababc(在c处产生失配) 按照朴素的匹配算法,我们应该将模模式串向 ...

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

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

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

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

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

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

  8. 钛媒体2022 EDGE AWARDS全球创新评选之「年度最佳企业服务品牌」揭榜

     关注ITValue,看企业级最新鲜.最价值报道! 2022年的尾声之际,疫情时代也终于落幕,时代的巨大变化,带来了或有迹可循的宝贵机遇.2022年,谁勇立于潮头?谁攀登于险峰?谁披荆于荒野?谁在逐浪 ...

  9. 云片荣膺WRE「年度最佳平台解决方案服务商」,推动零售业加“数”前行

    2022年8月24日,由WRE World Retail Elite主办的"第八届 WRE 零售数字化转型峰会"在上海万豪虹桥大酒店隆重召开.凭借在企业数字化赋能领域的卓越表现,云 ...

最新文章

  1. C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别
  2. Linux drm显示系统的两种方案
  3. P1865 A % B Problem (素数筛法,前缀和)
  4. 怎么改PHP_PHP实现RPC(简版)
  5. sql 分组求和_数据仓库工具–Hive(归纳笔记第六部分:SQL练习)
  6. C#中ManualResetEvent用法简介
  7. ajax回调函数有时成功有时失败,javascript - Ajax 回调函数行为随机。我做错了什么?...
  8. 【Siddhi】Siddhi 5 自定义函数简单使用
  9. 第 14 章 垃圾回收概述
  10. 开张第一天,一年之际在于春
  11. 图像去雾之何凯明暗通道先验去雾算法原理及c++代码实现
  12. 平时常见的音频文件格式有哪些呢?
  13. 澜沧江某水电站下坝址坝址初步设计
  14. Win10系统给共享文件夹设置密码的操作步骤
  15. Java毕设项目共享充电宝系统(java+VUE+Mybatis+Maven+Mysql)
  16. MTCNN配置及训练详细步骤
  17. 图灵对计算机行业的贡献论文,这届图灵奖得主究竟做了什么贡献?这篇1974年的论文给了我们答案...
  18. 解决mysql安装后无法设置初始密码的问题,亲测有效
  19. E.03.22 Learning Apps Have Boomed in the Pandemic. Now Comes the Real Test.
  20. 宝藏又小众的动漫壁纸素材网站分享

热门文章

  1. linux 串口读取陀螺仪,stm32读取陀螺仪MPU6050发送数据到串口
  2. JS写纸牌发牌和动画(详细解剖)
  3. java炸弹人素材_炸弹人图片_炸弹人模板_炸弹人设计素材下载
  4. 亚马逊S3文件存储的可视化
  5. 深入浅出Fetch API
  6. tesseract4.0.0 中文语言包_一份TensorFlow2.0中文教程
  7. 软件加入使用时间_你有了抢口罩软件,电商也进行了升级,我们又有了新软件(3月2日更新)...
  8. 驱动api_消费者驱动契约已死?
  9. html5音乐播放器设计论文,基于微信小程序的音乐播放器设计和毕业论文
  10. java创建一个成员方法吗,java构造方法和成员方法的区别