剛才在讀一段代碼的時候看到了一個不怎麼有趣的方法:
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. 嗯這篇就是吐槽……正在讀的這代碼裡的重複邏輯太多了!