首页 > 其他 > 详细

《编写可读代码的艺术》---把控制流变得可读

时间:2014-04-24 08:28:03      阅读:449      评论:0      收藏:0      [点我收藏+]

如果代码中没有条件判断、循环或者其他控制流程的语句,那么它的可读性会变得很好。而加入跳转和分支等控制流转部分会降低代码的可读性。

本章主要从代码的控制流转部分入手,来讨论如何让其变得可读。

把代码的控制流转部分修改的越自然越好,使得读者不用停下来,回头重读代码。

1 判断时:变量放左,常量放右

我们询问一个人的年龄的时候,

是问“请问你的年龄大于18岁吗”,

  if(age>18)

而不是“请问18岁小于等于你的年龄吗?”,

 if(18<=age)

计算机里也是遵从这样的表示方式:判断的侧是趋于变化的值,判断的侧是趋于常量的值。

ps: if(null==object),把null放左边,用于排除漏写一个等号的情况

但是现在IDE(Visual studio)会替你检查null=object这种情况,所以大可不必再坚持这种写法

2  if/else 语句块的顺序

比如同样的判断逻辑,你可以这样写

bubuko.com,布布扣
            //先处理一致情况
            if (a == b)
            {
                // 处理一致情况
            }
            else
            {
                // 处理不一致情况
            }
bubuko.com,布布扣

也可以这样写

bubuko.com,布布扣
            if (a!=b)
            {
                // 处理不一致情况
            }
            else
            {
                // 处理一致情况
            }
bubuko.com,布布扣

在阅读本文之前,你可能对处理顺序不怎么在意。下面是我们给出的一些建议:

  • 首先处理正逻辑而不是负逻辑,例如 if(ok),而不是if(!ok)
  • 首先处理掉简单的情况,这有利于让if和else处理代码在同一个屏幕内可见
  • 先处理有趣的情况或者是可疑的情况,这有利于第一时间回答读者的疑问

这些建议有时候会出现冲突,比如可疑的情况是负逻辑等,这个时候嘚取决于你的判断了。

比如可疑的情况 if(隔壁老王家的孩子!=亲生的)

比如更危险的    if(操作系统日志存在==false)

3 仅当处理代码简单的时候,使用三元运算符

来个例子

bubuko.com,布布扣
            //先处理一致情况
            if (a == b)
            {
                // 处理一致情况
            }
            else
            {
                // 处理不一致情况
            }
bubuko.com,布布扣

使用三元运算符可以把他们放到一行里面

a==b?  处理一致情况: 处理不一致情况

三元运算符其实就是对if/else的一种紧凑写法,但是它把多行代码凝缩到一行里面写法的代价就是可能造成阅读混乱并且难以调试。

是否使用三元运算符取决于你if/else代码块是否简单,比如只是从两个值中做出选择。

好的改造例子 GOOD

bubuko.com,布布扣
            // if/else 例子
            if (hour>=12)
            {
                timeString += "pm";
            }
            else
            {
                timeString += "am";
            }

            //改成三元运算符的例子
            timeString += hour >= 12 ? "pm" : "am";
bubuko.com,布布扣

不好的改造例子 BAD

bubuko.com,布布扣
            // if/else原始例子,代码自然易读
            if (exponent >= 0)
            {
                return mantissa * (1 << exponent);
            }
            else
            {
                return mantissa / (1 << -exponent);
            }
           
            //改成了三元运算之后,代码挤到一行里降低了可读性
            return  exponent>=0?mantissa * (1 << exponent):return mantissa / (1 << -exponent);
bubuko.com,布布扣

  指路明灯

默认情况下都使用if/else。三元运算符只有在最简单的情况下(比如值二选一)使用。

相对于追求最小化的代码行数,一个更好的建议是最小化读者阅读代码的时间。

4 不要 do->while

do->while的奇怪之处在于一个代码块的是否执行的条件,是在代码执行过之后再判断。

而且我们通常是从前往后阅读代码,但是do->while模式下,我们常常还要回过头再看一遍被保护的代码。

通常来讲,判断语句应该出现在它所“保护”的代码之前。

先判断,符合条件再执行,这是if、while、for等流程控制语句的执行方式。

 

 

未完待续

 

 

《编写可读代码的艺术》---把控制流变得可读,布布扣,bubuko.com

《编写可读代码的艺术》---把控制流变得可读

原文:http://www.cnblogs.com/kimmy/p/3683347.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!