14章 组织直线型代码 15章使用条件语句
1.必须有明确顺序的语句
所谓明确顺序的语句即语句执行必须按照一定得次序,它们之间是顺序相关的,例如:
$data = ReadDate(); $result = Calculate($data); PrintResult ($result);
以上三条语句的执行顺序是重要的,不可能变换顺序执行,只有读取数据后才能计算,而打印语句是不能在计算完毕前进行的。
如果语句之间有着依赖关系,那么需要采用方法使得这些依赖关系变得明显。
1)设法组织代码,使依赖关系变得明显。
2)使子程序名能够凸显依赖关系。
良好的命名习惯有利于显示化程序之间的顺序。(比如开头那段代码)
3)利用子程序参数明确显示依赖关系。
通过重写代码让数据以参数的方式在子程序之间传递。例如:
$result = 0; ComputeMonthly();//计算月度 ComputeQuarterly();//计算季度 ComputeAnnualy();//计算年度
这段代码顺序是,首先计算月度,然后计算季度,最后计算年度,每个计算依赖其之前的计算结果,每个计算子程序均重写$result的值,然后下一个子程序使用它。为了使顺序更加明显,可以采用如下的改进:
$result = ComputeMonthly($result);//计算月度 $result = ComputeQuarterly($result);//计算季度 $result = ComputeAnnualy($result);//计算年度
4)用注释对代码进行说明。
如果依赖关系不够明显,那么可以考虑使用注释的方式来对代码进行说明。
5)使用断言或者状态标志变量来标志语句执行顺序。
可以使用变量标识语句执行顺序,例如:
$order_flag = 0; ReadDate() { 。。。 $order_flag = 1; } Calculate() { if($order_flag == 1) { 。。。ok } else { error; return error; } $order_flag = 2; } PrintResult () { if($order_flag == 2) { 。。。ok } else { error; return error; } $order_flag = 3; }
然而,由于引入了新的变量,导致代码出错的可能性增加,因此,若非万不得已,不建议采用此方法。
2.顺序无关的语句
顺序无关的语句即执行顺序没有依赖关系的若干语句。
良好地组织这些语句有利于代码阅读,尽量避免在进行代码阅读的时候目光跳来跳去。
应当把相关的语句组织在一起,例如下面的代码:
组织不好的代码:
ComputeWorkerTotalNum();
ComputeBossAverageRevenue(); ComputeWorkerAverageRevenue(); ComputeBossSales(); ComputeWorkerExpense();
应当组织为:
ComputeWorkerTotalNum(); ComputeWorkerAverageRevenue(); ComputeWorkerExpense(); ComputeBossAverageRevenue(); ComputeBossSales();
3.if条件语句
1)编写if语句的时候应当遵循的原则。
a:首先写正常代码路径,再处理不常见的情况。
b:确保对于等量的分支是正确的(边界点情况)。
注意不要使用 ">" 代替 ">=" 或者"<"代替"<=",(这类似于小心避免数组或者循环的off-by-one错误)
c:把正常情况的处理放在if后面,而不要放在else后面。下面是一个示例:
糟糕实践:
if(inputError) { 处理错误 } else { 正确情况 } if(!processError) { 正确情况 } else { 处理错误 } 为了有更好的可读性,这段代码应当改成: if(!inputError) { 正确情况 } else { 处理错误 } if(!processError) { 正确情况 } else { 处理错误 }
这样处理后的代码可以使代码的阅读者将注意力集中到代码正常处理的流程上而不是异常错误的处理流程。
d:利用布尔函数调用简化复杂的检测。例如:
if(!error() && inputRight() && age==1987 ........) { do sth。。。。 } 可以改成: function check() { 进行校验 return 布尔值 } if(check()) { do sth。。。 }
2)case语句
case语句在某些情况下可以代替多条if-else语句
a:为case选择排列顺序
按字母顺序或者按数字顺序排列各种情况
把正常的情况排在前面
按照执行频率排列case子句
经常执行的情况排在最前面,最不经常执行的情况排在最后面。
b:使用case语句的诀窍
<1>简化每种情况对应的操作。
如果某种情况执行的情况非常复杂,那么就写一个子程序,并在该情况对应的case中调用,而不要把操作代码段本身放在这个case子句中。
例如:
case 'ok': 。。。。。 。。。。。 。。。。。 break; 可以改写成: function do_sth() { 。。。。 。。。。 } case 'ok': do_sth(); break;
<2>不要为了使用case语句而可以制造一个变量。
<3>把default子句只用于检查真正的默认情况。
例如:case的可能情况有1-3
则不好的代码:
case 1: 。。 break; case 2: 。。 break; default: .......
<4>利用default子句来检测错误。
例如:case 有1-4可能
case 1: 。。 break; case 2: 。。 break; case 3: 。。 break; case 4: 。。 break; default: 输出错误信息