最近有段十分流行的代码,是从江湖传闻“身怀八蛋”的铁道部发言人王勇平同志的一句名言:“不管你们信不信,我反正信了……这是生命的奇迹……它就是发生了”所引申出来的。这段代码虽然只是在调侃,但是围绕这段代码也产生了一些讨论(如代码风格,编程规范等等),在此顺手记录一下,就当无聊罢。
这段代码是这样的:
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内部的代码也会被编译器优化掉。您怎么看,为什么呢?
分享到:
相关推荐
【标题】"Itour 11年齐鲁软件大赛iphone组获奖代码" 提供的是一个在2011年度齐鲁软件大赛中获得奖项的iPhone应用程序的源代码。这个项目可能展示了当时的前沿技术和优秀设计,对于iOS开发者,尤其是初学者来说,是...
《理光2011年上市新品彩色复印机维修手册》是针对2011年度理光公司推出的新型彩色复印机的技术支持文档,旨在帮助专业技术人员进行设备的维护、故障诊断与修复工作。该手册详细涵盖了理光彩色复印机的各项功能、内部...
"Teched2011开发课程压缩包"是微软在北京举办的2011年度技术大会的开发者课程集合,其中包含了丰富的技术讲座和研讨会的PPT资料。这些文档旨在分享最新的开发技术和工具,帮助参会者提升专业技能,了解微软在开发...
【标题】"2011软考程序员真题"揭示了这个压缩包文件的主要内容,即2011年度全国计算机技术与软件专业技术资格(水平)考试中的程序员级别的试题。这个考试是针对那些希望在IT行业中从事编程工作或提升自身编程能力的...
描述中的“DSA2011注册”可能指的是该年度针对DSA的一种注册服务,可能是为了获取合法使用DSA的证书,或者是参加一个关于DSA技术的研讨会或培训课程。在这种情况下,注册可能涉及到以下过程: 1. **申请**:用户或...
"2011 星网锐捷笔试题(软件)" 这个标题揭示了这个资料包是关于2011年度星网锐捷公司针对软件岗位的笔试题目集。星网锐捷是一家知名的网络设备与解决方案提供商,其在软件开发和信息技术领域有很高的专业性。笔试...
Python是一种广泛使用的...2011年,Python被评为TIOBE编程语言排行榜的年度语言,反映了其在开发社区中的广泛影响力和接受度。总的来说,Python因其易学、易读、丰富的库和强大的社区支持而成为许多开发者的首选语言。
【百度之星程序设计大赛】是由中国互联网巨头百度公司自2005年起主办的一项年度编程竞赛,致力于为程序设计爱好者提供展示技能、互相学习的舞台。大赛已经连续举办了七届,逐渐成为中国乃至全球互联网领域规模最大、...
实验指导教师为曹霑懋教授,面向的是09级嵌入式4班的学生,具体实施时间为2010至2011年度第二学期。 #### 动态规划法原理 动态规划是一种用于解决多阶段决策过程中的最优化问题的数学方法。它将复杂的问题分解成一...
4. **KotlinConf和Kotlin Day**:参加这些年度大会,了解Kotlin的最新动态和最佳实践。 总之,Kotlin以其简洁、安全和高效的特点,已经成为现代软件开发的重要选择。无论是Java开发者寻求提升,还是新手入门编程,...
它曾荣获2008年度SourceForge最佳新项目奖,这标志着Magento在开源社区中的重要地位。 - **Magento特点**: - 模块化架构体系:这种设计使Magento能够轻松适应不同规模企业的特定需求。 - 丰富的功能集:Magento...
年度最佳程序员(2011) 大学IT挑战赛第三名(2004年) 最后公司的主要成员 阿尔伯塔大学软件设计与架构专业 软件架构师组和聚会 成就 获得同事的信任 在工作中受到赞赏并被提名到更高的职位 为当前工作场所的所有...
新成员可以快速了解项目的结构和代码,而资深成员则可以通过公开的代码审查过程分享最佳实践。此外,开源项目通常有活跃的社区论坛和文档,这为解决问题和获取技术支持提供了便利。 在Bedford Robotics的案例中,...
- **OpenStack技术大会**:这是一个聚集了全球OpenStack技术专家和实践者的年度大会。它提供了一个平台,让与会者能够分享和交流OpenStack相关的最佳实践、技术进展以及行业案例。 - **Rajeev Pandey**:他是HP...
Kotlin由JetBrains公司开发,于2011年开始设计,2016年成为Google I/O的官方支持语言。它的设计目标是提供更简洁、安全的语法,同时保持与Java的兼容性。 2. **语法特性**: - **空安全**:Kotlin通过可空类型和...
【西藏水资源:年报2019】是西藏水资源有限公司(TIBET WATER RESOURCES LTD.,简称“集团”,股票代码:1115)在2019年的年度报告,该公司自2011年6月30日起在香港联合交易所有限公司(“联交所”)主板上市。...
10. **游戏奖项**:Bastion自发布以来,获得了多项游戏奖项和提名,包括TGA年度最佳独立游戏,证明了其在游戏业界的地位。 总的来说,“巴斯汀”作为Bastion的提及,揭示了一个富有深度和艺术性的游戏作品,它不...