当我的方法是助手,实用程序或应该变成扩展?

时间:2011-09-25 22:44:17

标签: c# helper utility

例如,这个加密函数可以称为Utility?

public static string HashText(string text)
{
    byte[] encodedBytes;
    using (var md5 = new MD5CryptoServiceProvider())
    {
        var originalBytes = Encoding.UTF8.GetBytes(text);
        encodedBytes = md5.ComputeHash(originalBytes);
    }
    return Encode(encodedBytes);
}

虽然这个其他功能是助手吗?

public static string Encode(byte[] byteArray)
{
    if (byteArray == null || byteArray.Length == 0)
        return "";

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < byteArray.Length; i++)
    {
        sb.Append(byteArray[i].ToString("x2"));
    }
    return sb.ToString();
}

你可以提供一个简单的例子来说明我何时应该把某些东西变成方法的扩展?

3 个答案:

答案 0 :(得分:3)

何时制作方法静态辅助方法或扩展方法是主观决定。如果您需要帮助决定是否将方法作为扩展方法,那么问问自己将该方法作为普通实例方法包含在另一个类中是否有意义。

例如,您可能有这样的方法:

public class Customers
{
    public static Customer GetCustomer(string name)
    {
        // implementation
        return customer;
    }
}

这是否有意义作为String类的实例方法?

public class String
{
    public Customer GetCustomer()
    {
        // implementation
        return customer;
    }

    // other methods
}

设计方面,这使用完全不相关的类来调用String类。它使String类成为“厨房水槽”,它收集与字符串远程相关的任何内容。

另一方面,假设你有这样的方法:

public class StringHelper
{
    public static string[] Split(string s, string separator)
    {
            // implementation
            return array;
    }
}

这是否有意义作为String类的实例方法?

public class String
{
    public string[] Split(string separator)
    {
            // implementation
            return array;
    }

    // other methods
}

绝对!这是对现有Split功能的自然扩展它可能已包含在String的原始实现中。

介于两者之间的所有内容都可以根据具体情况进行判断。

答案 1 :(得分:2)

我不确定它是否完全正确但我经常听到帮助和实用程序这两个术语可以互换使用。他们都把我视为非正式的术语,因为他们提到了一种组织方法,而不是关于语言如何处理它们的任何具体方法。不过,有一些内涵可能会让你感到困惑。

实用程序方法通常是经常使用但不是特定于您的应用程序的方法。余弦和正弦方法就是很好的例子。

通常经常使用辅助类或辅助方法,但这些方法特定于您的应用程序。加密是一个很好的例子,因为采用的加密方法因应用程序而异。

考虑到你何时应该编写实用方法,答案是它不是真正的“应该”或“不应该”的情况。在性能方面存在微不足道的(如果有的话)差异,是否使用扩展方法或将参数传递给辅助/实用方法纯粹是一个偏好问题。虽然扩展方法可能会更清晰,但有许多语言不支持扩展方法,因此这两种方法都不对,并且对源代码的可读性影响微乎其微。

答案 2 :(得分:0)

关于扩展方法,不应过度使用它们。

扩展方法似乎扩展了对象的现有功能。例如,您可以使用方法StringBuilder扩展AppendHex

但是,如果功能似乎与对象或其现有功能无关,则使用“实用程序”类是更好的做法。阅读,编写和理解这些方法会更容易。