2012-05-19 12 views
5

mam następny kawałek kodu:Czy powinienem unikać magicznych ciągów, jak to tylko możliwe?

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

Robię kilka parsings AD, więc mam pewne ciągi jak "DC =", "objectCategory =" "LDAP: //",”, ",". " tak i tak. Znalazłem powyższy kod bardziej czytelny niż poniższy kod: (. Może znaleźliście przeciwny, let me know)

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

Nawet mogę mieć "DC" i "DC =" powinienem myśleć nazwy tych zmiennych lub podzielić je na dwie części :(Wtedy moje pytanie. powinienem unikać magiczne ciągi możliwie

AKTUALIZACJA

pewne wnioski:.

  • Istnieją sposoby, aby w ogóle unikać używania ciągów, co może być lepsze. Aby to osiągnąć, można użyć: klas statycznych, enumeratorów, stałych liczbowych, kontenerów IOC, a nawet refleksji.
  • Stały ciąg znaków pomaga upewnić się, że nie masz żadnych literówek (we wszystkich odwołaniach do ciągu znaków).
  • Stałe ciągi znaków interpunkcyjnych nie mają żadnej globalnej semantycznej. Bardziej czytelne byłoby ich użycie, ponieważ są one "," ". Użyj stałej, aby ten przypadek mógł być rozważony, jeśli ta stała może się zmienić w przyszłości, jak zmiana "," przez "." (Masz stałą wartość, która może ci pomóc w refaktoryzacji, chociaż nowoczesne narzędzia, takie jak resharper, robią to bez potrzeby stosowania stałej lub zmiennej).
  • Jeśli używasz tego łańcucha tylko raz, nie musisz go przekształcać w stałą. Należy jednak pamiętać, że stałą można udokumentować i pokazać w dokumentacji (jako Javadocs). Może to być ważne w przypadku nietrywialnych wartości ciągu.
+1

Myślę, że możesz być zainteresowany tematem [this] (http://programmers.stackexchange.com/questions/142278/are-nullable-types-preferable-to-magic-numbers). – Torv

+0

Myślę, że celujesz w odpowiedź z MainMa, prawda? –

+0

Tak, dobrze. Och, założyłem [inny interesujący temat] (http://programmers.stackexchange.com/questions/145738/should-a-string-constant-be-defined-if-its-only-going-to-be-used-once) dla Ciebie. te tematy nie odpowiadają na pytanie, ale są interesujące =) – Torv

Odpowiedz

1

Z pewnością wprowadziłbym stałe dla rzeczywistych nazw, takich jak "DC" i "objectCategory", ale nie dla interpunkcji. Chodzi o to, aby upewnić się, że nie masz żadnych literówek i takich, i że możesz łatwo znaleźć wszystkie odniesienia do miejsc, które używają tego magicznego ciągu. Interpunkcja nie jest tak naprawdę częścią tego.

Dla jasności zakładam, że magiczne struny są rzeczami, z którymi musisz sobie poradzić, że nie masz możliwości uczynienia ich liczbą zdefiniowaną przez stałą. Tak jak w komentarzu do twojego pytania, zawsze jest to lepsze, jeśli to możliwe. Ale czasami musisz użyć ciągu, jeśli musisz połączyć się z innym systemem, który tego wymaga.

+0

Brzmi dobrze, ciągi takie jak ",". ".", "/", "//", "=" mogą być zakodowane na sztywno. Chociaż chciałbym uniknąć czegoś takiego jak DcString + EqualString. –

+0

Tak, nie mają żadnej globalnej semantycznej.To jest test. –

Powiązane problemy