Chapter7 把控制流变得易读
条件语句中参数的位置:
一般原则:将变量放在左边,常量放在右边。更宽泛地说,将比较稳定的变量放在右边,变化较大的放在左边。
如 if ( length >= 10) 而不是 if ( 10 <= length)
if ( bytes_received < bytes_expected)而不是if (bytes_expected > bytes_received)
稳定的值相当于标的(比较的目标,目标点),而在人一般的思维习惯中,倾向于拿着一个“变化”的值去跟一个“固定”的值比较。
但是,在非“大小”比较的情况下,上面的原则似乎不起作用,例如验证一个请求参数是否为某个特定值:
if ( request.getParameterValue("name")).equals("Brandon")) ...
此时将常量"Brandon"可以避免出现空指针的情况(上行的参数没有name或者值为空)
if/else顺序
一些参考原则:
* 首先处理正逻辑而不是负逻辑,如 if ( debug) 而不是 if ( !debug)
* 首先处理简单的情况。这个时候可以使if else出现在同一屏幕(同一视野范围)
* 首先处理感兴趣的部分或者可以的情况。
上述原则很可能会相互冲突,这个时候就需要靠自己权衡。一个可以参考的方法是看大脑首先关注的是那一部分,潜意识下会不自觉地关注的部分。根据直觉来做决定有时候也是很好的。如:
if ( !url.hasQueryParam("expand_all")) { ...} else{...}
看到这个语句时,expend_all会不自觉地闯入我们的脑海,占据主要位置,因此此时下面的写法可能更具可读性:
if (url.hasQueryParam("expand_all")) {...} else {...}
又比如,下面的情况先处理简单的负逻辑可能更好一些:
if not file :
# log the error
else:
# do complex logic
?:条件表达式(三目运算符)
这个语法糖在一些情况下的确回事代码更简洁。下面的代码片段:
time_str += (hour >= 12) ? "pm" : "am"
这种方法不错,但我更倾向于下面的写法: