2012-02-29 5 views
8

Cuando estoy mirando mi código y le escribo cosas como ..El uso de una gran cantidad de cadenas codificada en código de

if (role == "Customer") 
{ 
    bCustomer = true; 
} 
else if (role == "Branch") 
{ 
    bIsBranch = true; 
} 

O

foreach(DataRow as row in myDataSet.Tables[0].Rows) 
{ 
    row["someField"]=somefield.Tostring() 
} 

hacen ustedes esto? ¿Cuándo está bien hacerlo y cuándo no deberías estar haciendo esto? ¿Qué pasa si alguno sería un mejor enfoque para escribir esto, si hay alguno?

Gracias por los comentarios: Supongo que debo agregar lo que si (para este ejemplo) solo estoy usando esta comparación de roles una vez? ¿Sigue siendo una mejor idea hacer una clase completamente nueva? Además, si tuviera 1 clase llamada "constantes", ¿hay varias clases que contengan constantes específicas, como la clase "roles", por ejemplo?

+0

Es difícil dar una respuesta definitiva, pero en el primer ejemplo, trataría de refactorizarlo para usar polimorfismo, si corresponde. En el segundo caso, probablemente crearía una clase contenedora alrededor de la DataTable que tiene los nombres de columna como constantes de cadena, por lo que hay un lugar central para ellos. Todos los consumidores solo usan la clase contenedora y no la DataTable. –

Respuesta

23

No. No utilice "magic strings". En su lugar, crea una clase estática con constantes, o una enumeración si puedes.

Por ejemplo:

public static class Roles 
{ 
    public const string Customer = "Customer"; 
    public const string Branch = "Branch"; 
} 

Uso:

if (role == Roles.Customer) 
{ 

} 
else if (role == Roles.Branch) 
{ 

} 

Aquí hay una good discussion on various solutions.

+0

¿No veo por qué esta es una instancia de 'cadenas mágicas'? Desde la wiki: "Una cadena mágica es una entrada que un programador cree que nunca vendrá de manera externa y que activa la funcionalidad que de otro modo estaría oculta. Un usuario de este programa probablemente proporcionaría una entrada que da una respuesta esperada en la mayoría de las situaciones. de hecho, inocentemente proporcionan la entrada predefinida, invocando la funcionalidad interna, la respuesta del programa a menudo es bastante inesperada para el usuario (apareciendo así "mágica") ". – pfries

+1

No soy seguidor de la redacción del artículo de wikipedia, pero fue la primera definición que encontré. En el software, las cadenas mágicas generalmente se refieren a valores de cadena que el desarrollador puede escribir fácilmente. – jrummell

+1

Normalmente pienso en 'cadenas mágicas' como banderas cuyo significado o uso es arcano o no es evidente por sí mismo. Si no fuera por el compilador, todo el lenguaje C# calificaría como cadenas mágicas según su definición, sin mencionar todos los lenguajes dinámicos interpretados. Yo escribo mal esas cosas todo el tiempo ... en realidad sí siento como magia cuando recuerdo la API sin referencia. – pfries

0

Bueno, en mi opinión depende de usted y depende del diseño de su aplicación. Lo miro por completo desde el lado positivo: si la aplicación funciona de la manera que se supone que funciona, todo está bien. IMHO

2

Siempre es mejor declarar las cadenas codificadas por separado como constantes en lugar de declarar una nueva cadena cada vez. Mantiene el código limpio y reduce los errores causados ​​por errores de tipeo.

En relación con lo que debería o no debería hacerse, todo depende del escenario.

1

Me gustaría hacer una clase estática Roles:

public sealed class Roles 
{ 
    public const string BRANCH = "Branch"; 
    public const string CUSTOMER = "Customer"; 

    public static bool IsCustomer(string role) 
    { 
     return role == CUSTOMER; 
    } 
} 

Luego en el código:

bCustomer = Roles.IsCustomer(role); 

Por otra parte, esto requiere un poco más de configuración, pero la RoleProvder (dependiendo de la Web o No) proporciona muchos buenos métodos.

0

El polimorfismo es una cosa, pero usar cadenas codificadas a lo largo de su código no es nada bueno. Es mucho mejor definir una variable que contenga la cadena y usar esta variable a lo largo del código. Este caso si necesita cambiar algo (créame que lo hará), puede simplemente cambiar el valor de esta variable y está hecho (¡también hay menos errores!)

2

Creo que un mejor enfoque es usar application settings lo que significa que ganó Nunca debe volver a compilar su código si cambian los valores de "Cliente" o "Sucursal". Los valores mágicos son obviamente malos, y este sería un buen primer paso/opción para alejarse de ellos. Además, mantiene sus valores en un solo lugar, y también creo que puede reload the settings en tiempo de ejecución sin reiniciar la aplicación (aunque yo no lo he probado).

E.g.:

if (role == Properties.Settings.Default.CustomerRole) 
{  
    bCustomer = true; 
} 
else if (role == Properties.Settings.Default.BranchRole) 
{  
    bIsBranch = true; 
} 
+0

¿Me puede mostrar algún código en la configuración de la aplicación para esto? –

+0

En Visual Studio, haga clic con el botón derecho en su proyecto, seleccione Propiedades-> pestaña Configuración. A continuación, haga clic para crear un archivo de configuración predeterminado (si no existe). Si es así, agregue sus entradas aquí para que CustomerRole sea una cadena con el valor "Cliente", etc. Luego puede hacer referencia a ellas a través de la instancia predeterminada estática, tal como lo he mostrado en mi ejemplo. Consulte la primera parte de este video: http://www.youtube.com/watch?v=t9WIvYQ1dNU y también 3:50 minutos en. – Jeb

0

Por razones de mantenimiento, se debe formalizar comparadores de cadena cuando sea posible, ya sea como constantes con nombre o como una enumeración. El beneficio para el programador es que puede localizar los cambios. Incluso cuando se utiliza una herramienta de refactorización, encontrar todos los lugares en los que se utiliza una cadena puede ser tedioso y propenso a errores. Es posible que solo tenga un lugar donde haga esta comparación hoy, pero usted o un futuro mantenedor pueden extender esto a otras partes del código. Además, la clase en sí misma puede crecer y debe romperse. Estas cosas tienden a aparecer lentamente en un programa a lo largo del tiempo.

Simplemente declaro estas cadenas como constantes cerca de donde se usan, pero juntas. No se moleste con una nueva abstracción como Roles hasta que sepa que la necesita. Si la cantidad de funciones que necesita para comparar crece o se necesita fuera de esta clase, puede crear una clase Roles enum o Roles, según la complejidad de la comparación.

Además, mediante el uso de constantes, indicas el uso previsto para el compilador, por lo que obtienes algunos beneficios menores de administración de memoria, que, dada tu comparación, es una buena práctica.

Cuestiones relacionadas