剛才在讀一段代碼的時候看到了一個不怎麼有趣的方法:
C#代碼
/// <summary> /// Add enough zeros to a number as to be represented on 4 characters /// </summary> /// <param name="offset"> /// The number that must be represented on 4 characters /// </param> /// <returns> /// </returns> private string GetExpandedOffset( long offset ) { string result = offset.ToString( ); for ( int i = 0; result.Length < 4; i++ ) { result = "0" + result; } return result; }
方法有注釋。方法體也就幾行。問題是什麼呢?且不提這方法在循環中使用了String的+=運算符而生成了很多無用對象……
問題是——這明顯就是重復勞動。.Net Framework裡的BCL裡有充分的工具方法來處理對象轉換到字符串的問題以及伴隨的格式化問題。
最常見的應用場景之一應該是控制台輸出吧,像是:
C#代碼
System.Console.WriteLine("{0}=0x{0:X}", anIntVariable);
這裡用的到了IFormatProvider規定的一些功能。
更直接的,Int32和Int64之類的類型本身就實現了IFormattable接口,所以我們可以把前面我說無趣的方法改成:
C#代碼
private string GetExpandedOffset( long offset ) {
return offset.ToString( "D4" ); }
一句解決。
這例子本身很簡單,不過有一個問題就是,在不熟悉自己所使用的庫的時候,很可能會寫出類似的重復代碼。如果能有什麼自動的方法檢查出這些重復的代碼就好了。不過當前到底有什麼分析工具能把像上面的“功能不完整”的重復代碼抓出來呢?
在那樣強悍的工具出現前,咱們還是自己好好認識清楚自己用的庫吧~
微軟的Phoenix編譯器框架確實非常的強悍,但是能不能檢測出這樣的重復代碼我還沒試來看看……
P.S. 嗯這篇就是吐槽……正在讀的這代碼裡的重復邏輯太多了!