`

[转载]谈谈2011年度最佳代码

阅读更多

 

原文: http://blog.zhaojie.me/2011/08/from-the-code-of-no-matter-you-believe-it-or-not.html

作者:赵劼

 

这段代码是这样的:

 

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是一门糟糕的语言,主要原因就是指它的表达能力太差,导致写出来的代码体现不出问题的解决方式,让人们把目光都集中在具体每条语句上了,所谓“见木不见林”。javascript,ruby,python等现代语言都在强调“做什么”而不是“怎么做”,语义上就有很大提高了。

回到目前这个具体问题上,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)一定会被调用一次,但是无所谓其结果是如何,这充分符合天朝某些部门喜欢装摸作样“咨询民意”的状况。

 

扩展思考

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

 

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

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

 

分享到:
评论
15 楼 guoapeng 2011-08-09  

这个应该用代理模式
if (you.believe(it) == true || you.believe(it) == false)  
{  
  new RailwayMinistryProxy(I).believe(it);  


14 楼 justjavac 2011-08-09  
whb1984 写道
引用
我说Java是一门糟糕的语言,主要原因就是指它的表达能力太差,导致写出来的代码体现不出问题的解决方式,让人们把目光都集中在具体每条语句上了,所谓“见木不见林”。C#等现代语言都在强调“做什么”而不是“怎么做”,语义上就有很大提高了。


这段话什么意思? 楼主能否深入讲解下?

java和目前很流行的FP语言相比
13 楼 Reset 2011-08-09  
try{
 u.believe();
}finally{
 i.believe();
}
12 楼 java_bigniu 2011-08-09  
无心徘徊 写道
楼主认为是
if("1".equels(a)) 还是 if(a.equals("1"))好呢。。


楼主的意思是在java中 a == null 要比 null == a看着舒服

如果没有a == null的判断

很显然 "1".equels(a) 略胜一筹

if(a == null || "".equals(a.trim()))

和 if(a == null || (a.trim()).equals(""))没任何区别
11 楼 whb1984 2011-08-09  
引用
我说Java是一门糟糕的语言,主要原因就是指它的表达能力太差,导致写出来的代码体现不出问题的解决方式,让人们把目光都集中在具体每条语句上了,所谓“见木不见林”。C#等现代语言都在强调“做什么”而不是“怎么做”,语义上就有很大提高了。


这段话什么意思? 楼主能否深入讲解下?
10 楼 b_l_east 2011-08-09  
楼主讲的还是比较深的,既讲了怎样写出好性能的代码,又讲了怎样用代码去准确体现业务的意思(而不出现偏差),更使用了这么有趣而前卫的例子---这真是好文章的啊。关注,顶!
9 楼 月色正浓 2011-08-09  
you.believe(it)封装成isBelieve(it)方法不就解决“语意”问题了
8 楼 Ayin2767 2011-08-09  
人家是有程序语言明确表达铁道部的逻辑,明文翻译。达到不言自明的效果。
真正编代码肯定不会这样啊。
7 楼 无心徘徊 2011-08-09  
楼主认为是
if("1".equels(a)) 还是 if(a.equals("1"))好呢。。
6 楼 javaoldboy 2011-08-09  
铁道部的逻辑嘛,经典!
5 楼 alexandrae2008 2011-08-09  
...牛啊...........
4 楼 form_rr 2011-08-08  
if (you.believe(it) == true || you.believe(it) == false)  
{  
   I.believe(it);  


无用的漂亮,低效的程序,多余的判断。

强烈抵制华而不实的东西!
3 楼 codingstandards 2011-08-08  
2 楼 tmj_159 2011-08-08  
代码水很深。。。。
1 楼 make_miracles 2011-08-08  
娱乐一下,看完了事,何必当真。

相关推荐

    谈谈在keil下的代码定位

    ### 在Keil下的代码定位详解 #### 一、引言 在嵌入式开发领域,Keil是一款非常流行的集成开发环境(IDE),尤其在基于8051内核的微控制器开发中占据着举足轻重的地位。Keil提供了丰富的功能来支持开发者编写高效...

    让我们来谈谈符号 代码解码指南.zip

    《让我们来谈谈符号 代码解码指南》可能详细介绍了各种条形码的标准、结构、编码原理以及如何实现有效的解码算法。书中可能还涵盖了条形码生成工具、扫描设备的选择与使用,以及在实际应用中的最佳实践。 此外,这...

    从实现原理谈谈低代码.docx

    "低代码实现原理详解" 从文档标题和描述可以看出,这篇文章主要讲解了低代码实现原理的各种方案,并从实现角度分析了低代码平台的优缺点。下面是从文档中提取的相关知识点: 1. 低代码的定义:低代码是指可视化...

    谈谈为什么你的 JavaScript 代码如此冗长

    不过,需要注意的是,随着语言的发展,新的特性和最佳实践不断涌现,因此持续学习和适应新趋势是至关重要的。对于那些可能不兼容旧浏览器的特性,如async/await,通常需要通过工具如Babel将其转换为ES5兼容的代码。

    代码设计,重构整理

    接下来,我们谈谈“修改代码的艺术”。在软件开发中,需求变更、bug修复等都需要对已有代码进行修改。这时,我们需要谨慎处理,遵循一定的原则。首先,确保充分理解原有代码的逻辑,再进行修改,以免引入新的错误。...

    代码未写,漏洞已出——谈谈设计不当导致的安全问题--腾讯.pdf

    代码未写,漏洞已出——谈谈设计不当导致的安全问题--腾讯.pdf

    PHP的代码安全

    谈谈关于PHP的代码安全相关的一些致命知识

    Proxy源代码分析--谈谈如何学习linux网络编程

    对于想要深入了解Linux网络编程的初学者来说,《Proxy源代码分析——谈谈如何学习Linux网络编程》是一篇非常有价值的资料。它不仅提供了具体的源代码分析,还通过实例帮助读者理解Linux网络编程的基本原理和技术要点...

    qq在线客服_QQ_qq举报代码_

    接下来,我们谈谈QQ举报代码。这通常是网站为了维护良好的社区环境而设置的一种机制,允许用户对不良内容或行为进行举报。举报代码一般是一个隐藏的链接或者表单提交,用户在遇到问题时可以点击或填写相关信息发送给...

    编码识别源代码

    首先,我们来谈谈字符编码。在计算机系统中,字符编码如ASCII、GBK、UTF-8等,是用来表示文本中字符的一种方式。ASCII是最基础的编码,只能表示128个基本的西文字符。GBK是中国常用的编码,可以表示更多的汉字。而...

    谈谈辩证法问题读书笔记.doc

    谈谈辩证法问题读书笔记.doc

    ACRush_2_1.zip_楼天城 代码_楼天城的代码

    首先,让我们来谈谈ACM/ICPC比赛。这是一项全球性的编程竞赛,旨在考验参赛者的算法设计、问题解决和编程能力。比赛中,参赛队伍需要在有限的时间内解决一系列复杂的编程问题,而速度和正确性是评判胜负的重要标准。...

    j2ee开发tomcat插件和格式化代码插件

    同时,许多IDE还集成了如Checkstyle和PMD等静态代码分析工具,它们可以检查代码是否遵循最佳实践,检测潜在的错误和坏味道,进一步提升代码质量。这些工具也可以与代码格式化插件配合使用,形成一个完整的代码质量...

    代码计数器

    首先,我们来谈谈代码行数统计的重要性。在软件开发过程中,代码行数(LOC,Lines of Code)常常被用作衡量项目复杂性和工作量的一个粗略指标。虽然它并不能完全反映代码的质量或效率,但在项目管理和估算开发时间时...

    editplus自动完成代码

    接下来,我们来谈谈自定义自动完成代码的过程。EditPlus允许用户创建自己的代码模板,这些模板可以在编写代码时通过快捷键或特定的触发词来调用。要创建一个新模板,你需要: 1. 打开“工具”菜单,选择“用户工具...

    前端代码规范总结(3篇).zip

    在前端开发领域,代码规范是确保项目质量和团队协作...遵循这些最佳实践,不仅能够提升代码质量,还能促进团队之间的有效沟通,从而提高整体项目开发效率。记住,良好的代码规范是构建健壮、可持续的前端项目的基石。

    表白代码,前端代码基于javascript

    接下来,我们谈谈“jsp”标签。JSP(JavaServer Pages)是Java平台上的服务器端技术,它允许开发者在HTML、XML或其他类型的文档中嵌入Java代码,以生成动态网页内容。在表白代码的场景中,JSP可能会用来处理用户提交...

    谈谈辩证法问题.pdf,这是一份不错的文件

    谈谈辩证法问题.pdf,这是一份不错的文件

    谈谈数据中心的应用性能管理最佳实施

    主动性能管理方法,如MIPS管理,通过减少指令数量,有效地降低了CPU升级需求,同时也提升了应用执行速度和代码质量。 然而,随着技术环境的复杂化,如Web、SOA、EDI的出现,单纯关注资源管理已不足以满足需求。事务...

Global site tag (gtag.js) - Google Analytics