C# 当我的方法是一个助手,实用程序还是应该变成一个扩展?

C# 当我的方法是一个助手,实用程序还是应该变成一个扩展?,c#,helper,utility,C#,Helper,Utility,例如,这个加密函数可以称为实用程序 public static string HashText(string text) { byte[] encodedBytes; using (var md5 = new MD5CryptoServiceProvider()) { var originalBytes = Encoding.UTF8.GetBytes(text); encodedBytes = md5.ComputeHash(origin

例如,这个加密函数可以称为实用程序

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();
}

你能提供一些简单的例子来说明什么时候我应该把某个东西变成一个方法的扩展吗?

我不确定它是否完全正确,但我经常听到helper和utility这两个术语可以互换使用。在我看来,它们都是相当非正式的术语,因为它们指的是组织方法,而不是语言如何处理它们的任何具体内容。尽管如此,仍有一些含义可能会为您消除一些困惑

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

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


关于什么时候应该编写实用方法,答案是这不是一种真正应该或不应该的情况。如果在性能方面存在任何差异,那么这是可以忽略的,无论您是使用扩展方法还是将参数传递给助手/实用工具方法,这纯粹是一个偏好问题。虽然扩展方法可能有更清晰的感觉,但有许多语言不支持扩展方法,因此这两种方法都不是错误的,对源代码的可读性的影响可以忽略不计。

我不确定它是否完全正确,但我经常听说helper和utility这两个术语可以互换使用。在我看来,它们都是相当非正式的术语,因为它们指的是组织方法,而不是语言如何处理它们的任何具体内容。尽管如此,仍有一些含义可能会为您消除一些困惑

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

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


关于什么时候应该编写实用方法,答案是这不是一种真正应该或不应该的情况。如果在性能方面存在任何差异,那么这是可以忽略的,无论您是使用扩展方法还是将参数传递给助手/实用工具方法,这纯粹是一个偏好问题。虽然扩展方法可能会给人一种更干净的感觉,但有许多语言不支持扩展方法,因此这两种方法都不是错误的,对源代码的可读性影响可以忽略不计。

关于扩展方法,不应该过度使用

当扩展方法似乎扩展了对象的现有功能时,它们是最好的。例如,您可以使用AppendHex方法扩展StringBuilder


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

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

当扩展方法似乎扩展了对象的现有功能时,它们是最好的。例如,您可以使用AppendHex方法扩展StringBuilder


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

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

例如,您可能有如下方法:

public class Customers
{
    public static Customer GetCustomer(string name)
    {
        // implementation
        return customer;
    }
}
public class StringHelper
{
    public static string[] Split(string s, string separator)
    {
            // implementation
            return array;
    }
}
作为String类的实例方法,这有意义吗

从设计角度看,这会将String类与一个完全无关的类结合起来。它使String类成为一个厨房水槽,可以收集任何与String远程相关的东西

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

public class Customers
{
    public static Customer GetCustomer(string name)
    {
        // implementation
        return customer;
    }
}
public class StringHelper
{
    public static string[] Split(string s, string separator)
    {
            // implementation
            return array;
    }
}
作为String类的实例方法,这有意义吗

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


介于两者之间的一切都可以根据具体情况进行判断。

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

例如,您可能有如下方法:

public class Customers
{
    public static Customer GetCustomer(string name)
    {
        // implementation
        return customer;
    }
}
public class StringHelper
{
    public static string[] Split(string s, string separator)
    {
            // implementation
            return array;
    }
}
作为String类的实例方法,这有意义吗

从设计角度看,这会将String类与一个完全无关的类结合起来。它使String类成为一个厨房水槽,可以收集任何与String远程相关的东西

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

public class Customers
{
    public static Customer GetCustomer(string name)
    {
        // implementation
        return customer;
    }
}
public class StringHelper
{
    public static string[] Split(string s, string separator)
    {
            // implementation
            return array;
    }
}
作为String类的实例方法,这有意义吗

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


介于两者之间的一切都可以根据具体情况进行判断。

也不要使用MD5,不要使用默认编码。如果在另一台计算机上运行代码,则可能与以前的哈希不匹配。使用固定的名称,如UTF8。另外,不要对生成哈希的方法使用名称Encrypt。期待阅读有关实际问题的答复,无论函数名称是否与之相关。@Guapo,我甚至不能说出问题的真正含义。也不要使用MD5,不要使用默认编码。如果在另一台计算机上运行代码,则可能与以前的哈希不匹配。使用一些固定的方法,如UTF8。另外,不要对生成哈希的方法使用名称Encrypt。期待阅读有关实际问题的答复,无论函数名是否与它相关。@Guapo,我甚至不知道问题的真正含义。谢谢你的帮助。在某些情况下,我会发现自己的函数经常做同样的事情,但不确定我是否应该将其归类为实用程序或帮助程序,而您的引用帮助了我;谢谢,这确实帮了我的忙。在某些情况下,我会发现自己的函数经常做同样的事情,但不确定我是否应该将其归类为实用程序或帮助程序,而您的引用帮助了我;