【问题标题】:Should I avoid magic strings as possible?我应该尽可能避免使用魔术字符串吗?
【发布时间】:2012-05-19 04:28:26
【问题描述】:

我有下一段代码:

    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)。这对于非平凡的字符串值可能很重要。

【问题讨论】:

  • 我想您可能对this 主题感兴趣。
  • 我想你的目标是 MainMa 的答案,对吧?
  • 是的,你说得对。哦,我为你创建了another interesting topic。这个主题不回答问题,但他们很有趣=)
  • 嘿,非常感谢。我刚读完,我喜欢 Thorbjørn Ravn Andersen 的结论和答案。我会挽救一些结论。

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


【解决方案1】:

我当然会为“DC”和“objectCategory”等实际名称创建常量,但不会为标点符号。这样做的目的是确保您没有任何拼写错误等,并且您可以轻松找到使用该魔术字符串的地方的所有参考。标点符号并不是其中的一部分。

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

【讨论】:

  • 听起来不错,像“,”这样的字符串。 “.”、“/”、“//”、“=”可能会被硬编码。虽然我想避免像 DcString + EqualString 这样的东西。
猜你喜欢
  • 2020-10-05
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多