2012-05-19 11 views
5

ho il prossimo pezzo di codice:Devo evitare le stringhe magiche possibile?

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

Sto facendo alcune parsings per AD, quindi ho alcune stringhe come "DC =", "objectCategory =", "LDAP: //",", ",". " così così. Ho trovato il codice di cui sopra più leggibile il codice qui sotto: (. Potrebbe essere trovato il opposto, vediamo un po' me lo faccia sapere)

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

Anche io possa avere 'DC' e 'DC =', dovrei pensare in i nomi di questa variabili o dividere questi in due :(Allora la mia domanda:. Devo evitare di stringhe di magia possibile

AGGIORNATO

Alcune conclusioni:?.

  • Ci sono modi per evitare di utilizzare le stringhe, il che potrebbe essere migliore. Per realizzarlo potrebbe essere utilizzato: classi statiche, enumeratori, costanti numeriche, contenitori IOC e persino riflessione.
  • Una stringa costante consente di assicurarsi di non avere errori di battitura (in tutti i riferimenti a una stringa).
  • Le stringhe costanti per la punteggiatura non hanno alcuna semantica globale. Sarebbe più leggibile utilizzare questi come sono ",". Utilizzare una costante per questo caso può essere presa in considerazione se tale costante può cambiare in futuro, come cambiare "," da "." (Avere una costante può essere d'aiuto in quel refactoring sebbene gli strumenti moderni come resharper lo facciano senza bisogno di una costante o variabile).
  • Se lo si utilizza solo una volta, non è necessario trasformarlo in una costante. Considera comunque che una costante può essere documentata e mostrata nella documentazione (come Javadocs). Questo può essere importante per valori di stringa non banali.
+1

Penso che potresti essere interessato a [questo] (http://programmers.stackexchange.com/questions/142278/are-nullable-type-preferable-to-magic-numbers) argomento. – Torv

+0

Penso che il tuo obiettivo sia la risposta di MainMa, giusto? –

+0

Sì, hai ragione. Oh ho fondato [un altro argomento interessante] (http://programmers.stackexchange.com/questions/145738/should-a-string-constant-be-defined-if-its-only-going-to-be-used-once) per te. questo argomento non risponde alla domanda ma sono interessanti =) – Torv

risposta

1

Farei sicuramente delle costanti per i nomi attuali come "DC" e "objectCategory", ma non per la punteggiatura. Il punto è di assicurarti di non avere errori di battitura e simili e di trovare facilmente tutti i riferimenti per i luoghi che usano quella stringa magica. La punteggiatura non fa realmente parte di questo.

Giusto per essere chiari, presumo che le stringhe magiche siano cose che devi affrontare, che non hai la possibilità di farle diventare un numero definito da una costante. Come nel commento alla tua domanda, è sempre preferibile se è possibile. Ma a volte è necessario utilizzare una stringa se è necessario interfacciarsi con altri sistemi che lo richiedono.

+0

Suona bene, stringhe come ",". ".", "/", "//", "=" potrebbero diventare codificati. Anche se mi piacerebbe evitare qualcosa come DcString + EqualString. –

+0

Sì, non hanno alcuna semantica globale.Questo è il test. –

Problemi correlati