最近接連維護兩個極其惡心的專案,一個 C++、一個 C#,全是網路相關。每次看到這種代碼,第一反應都是「重寫吧」,但管理層總以「穩定性」、「人員適應」為由駁回。結果?接下來幾個月我被這堆屎山纏身,痛苦不堪。
所有訊息處理函數統一簽名:void xxxx(void* pData)。函數內部全是指針強轉、偏移、讀寫交織:
int* pxx = (int*)pData;
pxx = XXX(sss);
pData += sizeof(int);
SH_XXX* pshxx = (SH_XXX*)pData;
Mxxxk(pshxx, xxxixx);
// ...
Send(g_Buf); // 所有函數最後都發送同一個全域緩衝區
痛點:
類別結構:
Code
DoubleCode : Code
ThreeCode : DoubleCode
SessionCode : ThreeCode // 筆者原文寫 TreeCode,疑為筆誤
StreamCode : SessionCode
每層只加一個屬性,使用時不斷 base.xxx、型別轉換。執行緒啟動:
Thread th = new Thread(new ThreadStart(base.Receive)); // 基類方法
// base.Receive 又呼叫子類 DealCode 處理訊息
到處都是「代理函數」——只做單純轉呼叫:
void Doxxx(object data) { xxxx.Doxxx(data); }
xxxx.Doxxxx(object data) { yyyy.Doxxx(data); }
yyyy.Doxxxx(object data) { base.xxxx(data); }
疑問:這是為了規範?還是故意混淆視聽防止被維護?
每天工作 12+ 小時,維護這種代碼簡直是折磨。突發奇想:把所有識別符(類名、方法名、變數名、參數名)全改成隨機亂碼,不就是最強加密?
void sekrj394329428 siweuirweiru234oodk(vdkdfnsdflk23dfkj dkf8s0fd0dsf, dsfklsdfklje sdfjffjj) {
dkf8s0fd0dsf.sl3n34klsfkljdsklfjl();
sfnekr234l324j = sdfjffjj.skjl3j4klj32lkj();
// ...
}
正準備寫工具實現,發現 Xenocode.Fox 已經把庫搞成這樣了。不過我還是想基於 System.CodeDom 自己寫一個,更個性化、更好玩。
糟糕的代碼不僅是技術債,更是對維護者的人身攻擊。若你有重構權限,請果斷動手;若無,請保護好自己的身心健康——趁早離開才是正解。