我应该尽可能避免使用魔法弦吗?

时间:2012-05-19 04:28:27

标签: language-agnostic coding-style magic-string

我有下一段代码:

    internal static string GetNetBiosDomainFromMember(string memberName)
    {
        int indexOf = memberName.IndexOf("DC=", StringComparison.InvariantCultureIgnoreCase);
        indexOf += "DC=".Length;
        string domaninName = memberName.Substring(indexOf, memberName.Length - indexOf);

         if (domaninName.Contains(","))
         {
             domaninName = domaninName.Split(new[] { "," }, StringSplitOptions.None)[0];
         }

         return domaninName;
     }

我正在为AD做一些解析,所以我有一些字符串,如“DC =”,“objectCategory =”,“LDAP://”,“,”,“。”谁谁。 我发现上面的代码比下面的代码更具可读性:(你可能会发现反对,让我知道。)

    private const string DcString = "DC=";
    private const string Comma = ",";

    internal static string GetNetBiosDomainFromMember(string memberName)
    {
        int indexOf = memberName.IndexOf(DcString, StringComparison.InvariantCultureIgnoreCase);
        indexOf += DcString.Length;
        string domaninName = memberName.Substring(indexOf, memberName.Length - indexOf);

         if (domaninName.Contains(CommaString))
         {
             domaninName = domaninName.Split(new[] { CommaString }, StringSplitOptions.None)[0];
         }

         return domaninName;
     }

即使我可能有“DC”和“DC =”,我应该在这些变量的名称中考虑或将它们分成两部分:(。然后我的问题: 我应该尽可能避免使用魔法字符串吗?

已更新

一些结论:

  • 有一些方法可以避免使用字符串,这可能会更好。要实现它可以使用:静态类,枚举器,数字常量,IOC容器甚至反射。
  • 常量字符串可帮助您确保没有任何拼写错误(在对字符串的所有引用中)。
  • 标点符号的常量字符串没有任何全局语义。使用它们会更具可读性,因为它们是“,”。如果该常数可能在将来发生变化,可以考虑使用常量,例如通过“更改”,“。”(有一个常数可以帮助你重构虽然 resharper 这样的现代工具可以在不需要常量或变量的情况下执行此操作。)
  • 如果您只使用字符串,则不需要将其变为常量。但是请考虑一个常量可以记录并显示在文档中(如Javadocs)。这对于非平凡的字符串值可能很重要。

1 个答案:

答案 0 :(得分:1)

我肯定会为“DC”和“objectCategory”之类的实际名称制作常量,但不会为标点符号制作常量。这一点是为了确保你没有任何拼写错误,并且你可以很容易地找到使用该魔术字符串的地方的所有参考。标点符号实际上不是其中的一部分。

为了清楚起见,我假设魔法字符串是你必须处理的事情,你没有选择让它们成为一个由常量定义的数字。正如您对问题的评论一样,如果可能的话,这总是更可取。但有时你必须使用一个字符串,如果你必须与其他需要它的系统接口。