【问题标题】:When my method is a Helper, Utility or should be turned into a Extension?当我的方法是 Helper、Utility 还是应该变成 Extension?
【发布时间】:2011-09-25 22:44:17
【问题描述】:

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

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

而这个其他函数将是一个 Helper ?

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

您能否提供任何简单的示例来说明何时应该将某些东西变成方法的扩展?

【问题讨论】:

  • 不要使用 MD5
  • 另外,不要使用Default 编码。如果你在另一台机器上运行你的代码,你可能不匹配之前的哈希。使用固定的东西,比如 UTF8。
  • 另外,不要将名称 Encrypt 用于生成哈希的方法。
  • 期待阅读有关函数名称是否与其相关的实际问题的回复。
  • @Guapo,我什至无法说出问题的真正含义。

标签: c# helper utility


【解决方案1】:

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

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

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 的原始实现中。

可以根据具体情况来判断。

【讨论】:

    【解决方案2】:

    我不确定这是否完全正确,但我经常听到术语助手和实用程序可以互换使用。它们都给我留下了相当非正式的术语,因为它们指的是一种组织方法,而不是关于语言如何处理它们的任何具体内容。不过,有些含义可能会为您解开一些困惑。

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

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

    关于何时应该编写实用程序方法,答案是它并不是真正的“应该”或“不应该”的情况。在性能方面存在微不足道的(如果有的话)差异,您是否使用扩展方法或将参数传递给帮助程序/实用程序方法纯粹是一个偏好问题。虽然扩展方法可能给人一种更简洁的感觉,但有许多语言不支持扩展方法,因此这两种方法都不是错误的,并且对源代码的可读性的影响可以忽略不计。

    【讨论】:

    • 谢谢,这确实帮助了我。在某些情况下,我会发现自己的功能经常做同样的事情,但不确定我是否应该将其归类为实用程序或帮助程序,你的参考帮助了我;)
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 2011-04-20
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 2015-11-25
      • 2013-06-21
      相关资源
      最近更新 更多