第二部分:简化循环和逻辑
把控制流变得易读
关键思想:把条件、循环以及其他队控制流的改变做得越“自然”越好,运用一种方式使读者不用停下来重读你的代码。
拆分超长的表达式
关键思想:将超长的表达式拆分成容易理解的小块
例如:
if(request.user.id == document.owner_id){
//user can edit this document
}
…
If(request.user.id != document.owner_id){
//document is read-only…
这段代码的主要概念是“该用户拥有此文档吗?”这个概念可以通过增加一个总结变量来表达得更清楚。
Final Boolean user_owns_document =(request.user.id == document.owner_id);
If(user_owns_document){
//user can edit this document
}
..
If(!user_owns_document){
//document is read-only
}
变量与可读性
假设你有一个网页,上面由几个文本输入字段,布置如下:
<input type = “text” id = “input1” value= “Dustin”>
<input type = ”text” id = “input2”value=”Trevor”>
<input type = ”text” id = “input3” value= “”>
<input type = “text” id = “input4”value=”Melissa”>
你的工作是写一个叫setFirstEmptyInput()的函数,它接受一个字符串并把它放在页面上第一个空的<input>字段中,返回已更新的元素(如果没有剩下任何空字段则返回null)。
var setFirstEmptyInput = function(new_value){
var found = false;
var i = 1;
var elem = document.getElementById(‘input’+ i);
while(elem != null){
if(elem.value== ‘’){
found= true;
break;
}
i++;
elem= document.getElementById(‘input’ + i);
}
if(found) elem.value = new _value;
return elem;
}
三个变量存在于整个函数中,并且写入了多次。中间变量(found)可以通过提前返回来消除,elem在整个代码中以循环的方式多次用到,这段代码让我们觉得elem就是在迭代的值,实际上只是在累加i。所以把while循环重写成对i的for循环。
var setFirstEmptyInput =function(new_value){
for(varI = 1; true; i++){
varelem = document.getElementById(‘input’ + i);
if(elem== null)
returnnull;//Search failed. No Empty input found.
if(elem.value==’’){
elem.value= new_vlaue;
returnelem;
}
}
}
第三部分:重新组织代码
抽取不相关的子问题
积极地发现并抽取出不相关的子逻辑。
1. 看看某个函数或代码块,问问自己,这段代码高层次的目标是什么?
2. 对于每一行代码,问一下,它是直接为了目标而工作吗?这段代码高层次的目标是什么?
3. 如果足够的行数在解决不相关的子问题,抽取代码到独立的函数中。