language-agnostic - 我应该尽可能避免使用魔法字符串吗?

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

最佳答案

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

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

关于language-agnostic - 我应该尽可能避免使用魔法字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10662299/

相关文章:

algorithm - 生成所有具有 n 个顶点的 DAG

ruby - Mixins 和/或 Traits 有哪些很好的例子?

objective-c - Cocoa 与代表进行应用程序的方式

java - 什么时候以及为什么我们需要将一个类(class)分成许多类(class)?

coding-style - 源文件头中 "$Id: ..."行的用途

events - bbvEventBroker 强类型且没有魔法字符串

javascript - 对于外部 JS 文件有类似 T4MVC 的解决方案吗?

language-agnostic - 如何构建无锁队列?

unit-testing - 当正确性定义不明确时进行测试?

asp.net-mvc - 如何在 MVC View 中处理 "magic strings",例如元素 ID :s?