制作一个从不使用扩展对象的扩展方法是一个好习惯吗?

时间:2010-09-24 13:52:11

标签: c# asp.net-mvc extension-methods

在我们的ASP.NET MVC项目中,我们使用HtmlHelper扩展方法来生成静态谷歌地图。

public static MvcHtmlString StaticMap(this HtmlHelper helper, string address, string alt, int width, int height, int zoom)
{
    var src = new Uri("http://maps.google.com/maps/api/staticmap?markers=size:mid|color:red|{0}&zoom={1}&size={2}x{3}&maptype=roadmap&sensor=false".FormatInvariant(Uri.EscapeUriString(address), zoom, width, height));
    var href = new Uri("http://maps.google.com/maps?f=q&source=s_q&hl=en&q={0}".FormatInvariant(Uri.EscapeUriString(address)));

    var img = new TagBuilder("img");
    img.MergeAttribute("src", src.ToString());
    img.MergeAttribute("alt", alt);

    var link = new TagBuilder("a") { InnerHtml = img.ToString() };
    link.MergeAttribute("href", href.ToString());

    return MvcHtmlString.Create(link.ToString());
}

对于这个新项目,我们还试图保持所有代码分析规则。现在,显然,Visual Studio代码分析表明我们应该删除helper参数,因为它没有被使用。

这让我想知道扩展方法是否应该总是使用扩展对象,如果没有,那么它可能不应该是扩展方法。

是否有人指向可帮助我做出决定的指南或说明?

3 个答案:

答案 0 :(得分:12)

如果您没有使用helper对象,则不会扩展任何内容,并且没有理由不在自己的命名空间中将其作为常规静态方法。

答案 1 :(得分:4)

扩展方法和静态方法之间使用代码的区别纯粹是概念性的;一个对象以与实例方法相同的方式涉及特定类型的对象,而另一个则不是。

就是这样,我会问一个问题,“是否考虑过这个操作是对HtmlHelper对象有意义的?”。这反过来变成“考虑HtmlHelper对象来提供这个操作,有意义吗?”。如果我对该问题回答“是”,我会认为扩展方法是一种合理的方法,无论我是否使用了HtmlHelper对象。相反,如果我对该问题回答“否”,我会认为扩展方法是一种不明智的方法,即使HtmlHelper对象确实被使用了。

代码分析在分析代码使用方面比在概念方面做得更好,所以它在这里给出了警告。这是不完美的,实际上还有其他情况下忽略参数是合理的(保持与先前版本的兼容性或接口是最好的情况,“保留供将来使用”是一个更有争议的案例)。

值得注意的是,在某些语言中(嗯,C ++),您可以精确地保留参数名称,以表示“此参数在签名中,但不会被使用”。我非常喜欢这个,因为通常不使用参数是一个坏的标志,所以有一种方法可以表明你是故意的。

编辑:

另一个理由。想象一下,你在使用相关对象的类上有一个扩展方法。现在假设你意识到你可以通过以不再使用对象的方式重写来使其更可靠,更高效或“更好”地获得某些“更好”的价值。既然你已经改进了它,你是不是应该继续保留扩展方法?你是否应该被迫继续使用劣质版本?

答案 2 :(得分:1)

为什么你开始使用这个扩展方法?我会说这不是你应该做的事情。我想不出一个很好的理由。