2012-05-19 11 views
5

tengo el siguiente fragmento de código:¿Debo evitar cadenas mágicas como sea posible?

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

estoy haciendo algunas parsings para la EA, así que tengo algunas cadenas como "DC =", "objectCategory =", "LDAP: //",", ",". " tal y tal He encontrado el código más legible que el código de abajo: (. Puede encontrado el opuesto, dejo' me sé)

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

Incluso yo puede tener 'CC' y 'DC =', que debería pensar en los nombres de estas variables o dividir estos en dos :(Entonces mi pregunta:. debo evitar cuerdas mágicas posible

ACTUALIZADO

Algunas conclusiones:?.

  • Hay formas de evitar el uso de cadenas, lo que podría ser mejor. Para lograrlo se podría utilizar: clases estáticas, enumeradores, constantes numéricas, contenedores de COI e incluso reflexión.
  • Una cadena constante te ayuda a asegurarte de que no tienes errores tipográficos (en todas las referencias a una cadena).
  • Las cadenas constantes para la puntuación no tienen ninguna semántica global. Sería más legible utilizar estos ya que son ",". Usar una constante para este caso se puede considerar si esa constante puede cambiar en el futuro, como cambiar "," por "." (Tener una constante puede ayudarlo en esa refactorización aunque las herramientas modernas como reafilador lo hacen sin necesidad de una constante o variable).
  • Si solo lo utiliza cadena una vez que no necesita convertirlo en una constante. Sin embargo, considere que una constante puede documentarse y aparecer en la documentación (como Javadocs). Esto puede ser importante para valores de cadena no triviales.
+1

Creo que le puede interesar el tema [this] (http://programmers.stackexchange.com/questions/142278/are-nullable-types-preferable-to-magic-numbers). – Torv

+0

Creo que apuntas la respuesta desde MainMa, ¿verdad? –

+0

Sí, tienes razón. Oh fundo [otro tema interesante] (http://programmers.stackexchange.com/questions/145738/should-a-string-constant-be-defined-if-its-only-going-to-be-used-once) para ti. estos temas no responden a la pregunta pero son interesantes =) – Torv

Respuesta

1

Sin duda haré constantes para los nombres reales como "DC" y "objectCategory", pero no para la puntuación. El objetivo de esto es asegurarte de que no tengas ningún error tipográfico y eso y que puedas encontrar fácilmente todas las referencias de los lugares que usan esa cadena mágica. La puntuación no es realmente parte de eso.

Para que quede claro, supongo que las cadenas mágicas son cosas con las que tienes que lidiar, que no tienes la opción de convertirlas en un número definido por una constante. Como en el comentario de su pregunta, siempre es preferible si eso es posible. Pero a veces debes usar una cadena si tienes que interactuar con algún otro sistema que lo requiera.

+0

Suena bien, cadenas como ",". ".", "/", "//", "=" pueden ir codificados. Aunque me gustaría evitar algo como DcString + EqualString. –

+0

Sí, no tienen semántica global.Esa es la prueba. –

Cuestiones relacionadas