代碼大全讀書筆記 14章 組織直線型代碼 15章條件語句

14章  組織直線型代碼    15章使用條件語句php


1.必須有明確順序的語句數組

所謂明確順序的語句即語句執行必須按照必定得次序,它們之間是順序相關的,例如:函數

$data = ReadDate();
$result = Calculate($data);
PrintResult ($result);

以上三條語句的執行順序是重要的,不可能變換順序執行,只有讀取數據後才能計算,而打印語句是不能在計算完畢前進行的。spa


若是語句之間有着依賴關係,那麼須要採用方法使得這些依賴關係變得明顯。code

1)設法組織代碼,使依賴關係變得明顯。input

2)使子程序名可以凸顯依賴關係。it

良好的命名習慣有利於顯示化程序之間的順序。(好比開頭那段代碼)io

3)利用子程序參數明確顯示依賴關係。function

經過重寫代碼讓數據以參數的方式在子程序之間傳遞。例如:class

$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:
輸出錯誤信息
相關文章
相關標籤/搜索