iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
4
Mobile Development

如何用 Laravel 撰寫難以維護的專案系列 第 5

[Day 5] 從函式架構建立難以維護的程式碼

談完變數怎麼處理之後,我們來探討從函式的架構,怎麼撰寫出難以維護的程式碼。

排版

混用 Tab 和 space 排版,或者根本不排版。由於 Tab 的間隔沒有固定的規範,這可以讓之後的工程在不同環境時,不斷被混亂的排版誤導。

這個技巧最棒的地方是,排版的影響是幾乎橫跨所有檔案的。所以之後的工程師如果嘗試排除問題,在沒有任何自動化工具的幫助,幾乎不可能完成。

避免大括號

在語義許可的情況下,絕不使用大括號。

一個函式包含千言萬語

每個函式都越長越好,最好不要低於一千行。當然,要寫成很深的巢狀。

巢狀結構

即使只使用有一點複雜的巢狀結構,也可以輕易擊垮其他人的短期記憶。特別是當這段程式碼無法在螢幕上同時看到開頭和結尾時。

巢狀 switch 結構

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";

上一篇
[Day 4] 混淆變數命名的利器!談匈牙利命名法
下一篇
[Day 6] 怎麼讓剛建立的專案難以維護
系列文
如何用 Laravel 撰寫難以維護的專案30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
Mother Soup
iT邦新手 5 級 ‧ 2020-09-06 13:19:31

太狠了 太狠了

1
小克
iT邦新手 4 級 ‧ 2020-09-07 09:12:19

應該是「偽裝成程式碼的註解」才對?

ReccaChao iT邦新手 1 級 ‧ 2020-09-07 10:49:28 檢舉

沒錯!感謝修正

我要留言

立即登入留言