談完變數怎麼處理之後,我們來探討從函式的架構,怎麼撰寫出難以維護的程式碼。
混用 Tab 和 space 排版,或者根本不排版。由於 Tab 的間隔沒有固定的規範,這可以讓之後的工程在不同環境時,不斷被混亂的排版誤導。
這個技巧最棒的地方是,排版的影響是幾乎橫跨所有檔案的。所以之後的工程師如果嘗試排除問題,在沒有任何自動化工具的幫助,幾乎不可能完成。
在語義許可的情況下,絕不使用大括號。
每個函式都越長越好,最好不要低於一千行。當然,要寫成很深的巢狀。
即使只使用有一點複雜的巢狀結構,也可以輕易擊垮其他人的短期記憶。特別是當這段程式碼無法在螢幕上同時看到開頭和結尾時。
switch 裡面包 switch 是對工程師來說極具傷害力的結構。
跟變數一樣,適當的利用函式命名,可以讓你的函式更難讀懂,達到我們讓程式碼難以維護的目的,例如:
確保每個函式都比名稱顯示的多做(或少做)一點事情。舉個簡單的例子,isValid($x)
除了檢查 $x
是不是合法的之外,可以順便將 $x
轉成二進位,並存進資料庫裡面。
實作一個非常複雜的演算法時,參照傳統軟體開發的原則,先想出完整設計過後,再開始寫程式。針對該演算法的每一步驟寫出非常詳細的文件,文件詳細程度越高越好。
比方說,你的設計文件可能會有這樣的標題:
1.2.4.6.3.13 - 計算退貨時的歸還金額
然後(這裡是重點!),你的函式命名為:
act1_2_4_6_3_13()
函式本身不用再註解了,畢竟設計文件已經寫過了!
由於需求可能會改變,設計文件的內容與架構也會跟著改變。不過,文件的編號是自動排序的,但是函式的名稱不是。所以,隨著時間流逝,很快這段函式的用途就會流失在過去的文件裡,讓之後的工程師開始他對文件的大航海冒險。
包含看起來像是程式碼,但是其實是註解的段落:
for($next = 0; $next < $array_len; $next++)
{
$total += $array[$next+0 ];
$total += $array[$next+1 ];
$total += $array[$next+2 ]; /* 加速
$total += $array[$next+3 ]; *
$total += $array[$next+4 ]; *
$total += $array[$next+5 ]; */
$total += $array[$next+6 ];
$total += $array[$next+7 ];
}
沒有上色的話,可以看出哪裡被註解了嗎?
assert()
避免使用 assert()
功能。他可能使本來需要三天的除錯工作變成十分鐘搞定。
==
和 ===
交錯使用 ==
和 ===
,讓之後維護的工程師誤以為這樣的設計有什麼特殊意義。
'
和 "
交錯使用 '
和 "
,讓之後維護的工程師誤以為這樣的設計有什麼特殊意義。
這方法只在 php5.X 的版本有用
PHP 的八進位表示法,相當的令人困惑。讀者可以自行判斷一下,下面的程式碼分別會印出什麼,然後到 PHP Sandbox 看看自己的判斷是否正確:
echo (011) . "\n";
echo (018) . "\n";
echo (018531) . "\n";
echo (011811) . "\n";