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

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

这段代码是这样的:

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内部的代码也会被编译器优化掉。您怎么看,为什么呢?


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无锡计算机硬件培训,无锡锡山办公软件电脑基础培训随到随学 学会为止

一、办公 2个月WORD文字处理;EXCEL电子表格应用;PowerPoint动画幻灯片制作;国际互联网、电子邮件、网上传真;软件安装、计算机维护、基础、常用办公硬件的使用(打印机、扫描仪、刻录机、数码相机等)从事行政、管理、文秘、销售、…

以太网和局域网的关系

以太网 以太网是当今现有局域网采用的通用通信协议标准,组建于七十年代早期。Ethernet(以太网)是一种传输速率为10Mbps的常用局域网(LAN)标准。在以太网中,所有计算机被连接一条同轴电缆上,采用具有冲突检…

不懂卷积神经网络?别怕,看完这几张萌图你就明白了

本文来自AI新媒体量子位(QbitAI)这篇文章用最简明易懂的方式解释了卷积神经网络(CNN)的基本原理,并绕开了里面的数学理论。 同时,如果想对从头开始构建CNN网络之类的问题感兴趣,作者推荐去读《 …

xrd连续扫描和步进扫描_一种提高xrd实验精度的方法

一种提高xrd实验精度的方法【专利摘要】本发明公开了一种提高XRD实验精度的方法,包括如下步骤:步骤1:将待测试样进行处理至表面平整光洁;步骤2:选用步进扫描方式对待测钢试样进行XRD实验,步进扫描方式的扫描…

2018双一流排名 计算机,2018中国双一流高校名单

目前全球范围内,比较有影响力的世界大学排名包括《QS世界大学排名》、《世界大学学术排名(ARWU)》、《泰晤士高等教育世界大学排名》、《usnews世界大学排名》和CWUR沙特阿拉伯全球大学评级中心世界大学排名。这些排名从各个方面对世界范围内的高校进行综合排名&…

交换机和集线器的区别

集线器采用的是共享带宽的工作方式,简单打个比如,集线器就好比一条单行道,“10M”的带宽分多个端口使用,当一个端口占用了大部分带宽后,另外的端口就会显得很慢。相反,交换机是一个独享的通道,它…

移动平台还有哪些创业机会

这是一个移动互联网创业的最好时代。 过去的2011年,国内大批创业者为移动互联网而疯狂。这个超过200亿元的市场牢牢吸引着他们,每天都有新鲜的主意转化为应用。 移动互联网时代的创业成本远小于互联网时代。创新工场创始人李开复在2011中国移动开发者大…

Swift封装 滑出式导航栏

前言: 本文将会创建以下几个主类: DWContainerViewController:这包含了左视图,中视图和右视图控制器的视图,并处理动画和滑动等操作。 DWCenterViewController:中央面板。 DWSidePanelViewController&#…

广东电网计算机专业笔试题目,广东电网笔试题目

广东电网笔试题目笔试是一种与面试对应的测试,是以填写的方法考核应聘者学识水平的重要工具。这种方法可以有效的测量应聘人的基本知识、专业知识、管理知识、综合分析能力和文字表达能力等素质及能力的差异。下面是小编为大家收集的广东电网笔试题目,希…

波特率和比特率

波特率(符号率),可以理解为传输介质实际能达到的电压变化,比如每秒可以改变多少次。 比特率,是逻辑层面上每秒能传输多少个比特。 考虑最简单的不归零编码,用5伏电压表示1,-5伏电压表示0&…

usart和uart 的区别

摘自:https://blog.csdn.net/meic51/article/details/7714847 什么是同步和异步 转自https://blog.csdn.net/seashine_yan/article/details/71192283转载于:https://www.cnblogs.com/chulin/p/8661720.html

苹果产品开发的绝密工作流程

长期以来苹果产品开发流程在很多方面都笼罩着一层神秘的面纱,而在AdamLashinsky新发行的《InsideApple:HowAmerica’sMostAdmired–andSecretive–CompanyReallyWorks》一书中对这些流程有所涉及。这本书同时谈论了苹果公司各个不同的方面,包括其理念、招…

Linux系统集群架构线上项目配置实战(一)

项目整体介绍 **整个项目包括以下几个应用工程** 1、 用户APP 2、 商家APP 3、 业务平台管理后台 4、 商家业务管理后台 5、 官网 **整体项目规划设计如下** 1、 用户APP采用JAVA环境布署,初始环境两台服务器,实现负载均衡与高可用,前端…

如何确定autosar的版本_AUTOSAR编码指南(中文版)

在汽车应用领域,软件开发变得越来越重要。随着安全、环境以及便利性需求的增长,车辆中应用电子系统的数量也在急速增长。其中有90%的创新应用都是基于软件驱动的电子组件。而这些组件的研发成本占车辆开发成本的40%,快速稳定的发展需要整合更…

3个月计算机考研,【图片】(重开)三个月考研成功的心路历程 -南邮计算机【南京邮电大学研究生院吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这个帖子教你如何在较短时间拿到大部分的分值。声明:这个经验是我个人的经历可能对有些人不适合 时间充裕的还是老老实实打基础,按部就班的三轮复习。18年考研 南邮 初试数据结构 复试微机原理 。我是国庆之…

PS把一张白色背景的图片设为透明

方法一: 1.双击图层缩略图上的小锁图标(注意,这里不要拖动小锁进行删除锁定),弹出“新建图层”,确定 2.右键左侧第四个功能菜单,选择魔棒工具 3.用魔棒工具在白色背景区域点击一下,选…

HTML5 webfont字体图标的使用

2019独角兽企业重金招聘Python工程师标准>>> 一.参考文献 1.http://www.cnblogs.com/yes-V-can/p/5716853.html 2.http://blog.csdn.net/zhouwangling_/article/details/53096649 二.html使用方法 1.下载字体 网上百度自己要使用的字体,一般下载的是ttf格…

算法导论中英文版下载

算法导论: 学过计算机的都知道,这本书可以说是全世界最权威的算法课程的大学课本了,基本上全世界的名牌大学用的教材都是它。这本书一共四位作者,Thomas H. Cormen,Charles E. Leiserson 和 Ronald L.Rivest 是来自 MI…

javaweb不同用户需要几张表_程序员必备2020版:JavaWeb快速进阶全套教程

Java Web应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的Servlet容器中运行。JavaWeb项目简单来说就是一个应用程序,比如每天打开的QQ、微信、百度地图等,这些都是应用程序。有很多同学反应Ja…