開始編寫 AOP 織入器的解析器階段,採用策略:借鑑 SharpDevelop/NRefactory 現有解析器核心,避免重複造輪子。即使是 RC2 版本,原始碼中仍存在可疑邏輯,需審慎審查修正。
static public int Compare(IList a, IList b, IComparer comparer) {
if (a == null || b == null) {
return 1; // 問題 1:null 比較語意模糊,應拋 ArgumentNullException
}
if (a.Count != b.Count) {
return Math.Sign(a.Count - b.Count);
}
int limit = (a.Count < b.Count) ? a.Count : b.Count; // 問題 2:前已檢查 Count 相等,此處冗餘
for (int i = 0; i < limit; i++) {
if (a[i] is IComparable && b[i] is IComparable) { // 問題 3:忽略傳入的 comparer!
int cmp = comparer.Compare(a[i], b[i]);
if (cmp != 0) return cmp;
}
}
return a.Count - b.Count; // 永遠回傳 0
}
| 問題 | 嚴重度 | 建議修正 |
|---|---|---|
| null 回傳 1 | 高 | 拋 ArgumentNullException 或定義明確 null 排序語意 |
| limit 計算冗餘 | 低 | 簡化為 int limit = a.Count; |
| 忽略 IComparer 參數 | 嚴重 | 直接使用 comparer.Compare,移除 is IComparable 檢查 |
| 迴圈無意義 | 嚴重 | 若比較器相等則直接回傳 0 |
查閱 Mono 來源碼確認上述邏輯已重寫。懷疑原作者可能在非最佳狀態下撰寫(酒後編程?)。這提醒我們:即使成熟開源專案,核心演算法也需獨立驗證。
解析器整合看似捷徑,實則需要深入理解上游專案架構。SharpDevelop 代碼品質參差不齊,核心解析器尚可,但工具方法庫需逐一審查。建立自動化代碼品質閘門(StyleCop、Roslyn Analyzer、單元測試覆蓋率)對維護織入器專案至關重要。