避免重复代码——know your library2011-06-26 iteye rednaxelaFX刚才在读一段代码的时候看到了一个不怎么有趣的方法: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. 嗯这篇就是吐槽……正在读的这代码里的重复逻辑太多了!