2012-05-19 2 views
5

У меня есть следующий фрагмент кода:Должен ли я избегать магических струн, насколько это возможно?

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

Я делаю некоторые parsings для 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 =“, я должен думать в имена для этих переменных или разделить их на две части :(Тогда мой вопрос:. Должен ли я избежать магических строк как можно

ОБНОВЛЕНО

Некоторые выводы:.

  • Есть способы избежать использования строк вообще, что может быть лучше. Для его достижения можно было использовать: статические классы, счетчики, числовые константы, контейнеры МОК и даже отражение.
  • Постоянная строка поможет вам убедиться, что у вас нет опечаток (во всех ссылках на строку).
  • Константные строки для пунктуации не имеют глобальной семантики. Было бы более читаемым использовать их, поскольку они являются ",". Использовать константу для этого случая можно, если эта константа может измениться в будущем, например изменение "," на "." (Имейте константу, которая может помочь вам в этом рефакторинге, хотя современные инструменты как resharper делают это без постоянной или переменной).
  • Если вы используете его только в том случае, если вам не нужно вносить его в константу. Однако следует учитывать, что константа может быть документирована и показана в документации (как Javadocs). Это может быть важно для нетривиальных строковых значений.
+1

Я думаю, вас может заинтересовать [this] (http://programmers.stackexchange.com/questions/142278/are-nullable-types-preferable-to-magic-numbers). – Torv

+0

Я думаю, вы намереваетесь ответить от MainMa, верно? –

+0

Да, ты прав. О, я основал [еще одну интересную тему] (http://programmers.stackexchange.com/questions/145738/should-a-string-constant-be-defined-if-its-only-going-to-be-used-once) для тебя. эти темы не отвечают на вопрос, но они интересны =) – Torv

ответ

1

Я бы точно сделал константы для настоящих имен, таких как «DC» и «objectCategory», но не для пунктуации. Дело в том, чтобы убедиться, что у вас нет опечаток и т. Д., И что вы можете легко найти все ссылки для мест, которые используют эту магическую строку. Пунктуация на самом деле не является частью этого.

Просто, чтобы быть ясным, я предполагаю, что магические строки - это вещи, с которыми вам приходится иметь дело, что у вас нет возможности сделать их числом, определенным константой. Как и в комментарии к вашему вопросу, это всегда предпочтительнее, если это возможно. Но иногда вы должны использовать строку, если вам нужно взаимодействовать с какой-либо другой системой, которая ее требует.

+0

Звучит неплохо, строки типа ",". «.», «/», «//», «=» могут быть жестко закодированы. Хотя я бы хотел избежать чего-то вроде DcString + EqualString. –

+0

Да, у них нет глобальной семантики.Это тест. –

Смежные вопросы