Pages

Monday, March 6, 2017

Deshacerse de las 'Magic Strings' en C#

'Una magic string es un input que el programador cree que nunca vendra de una fuente externa y que activa funcionalidad que de otra manera estaria oculta.'


Basicamente el termino se usa para identificar a las cadenas existentes directamente en nuestro codigo (hard-codeadas). Testas cadenas sona  veces necesarias en una aplicacion o al menos a veces no pueden ser evitadas en algunas situaciones  (como cuando tenemos que lidiar con codigo antiguo).
El principal problema con las Cadenas Magicas es que son propensas al error, especialmente si son usadas en ams de un lugar de la aplicacion, porque podriamos aquivocarnos al teclarla y no tendriamos ningun error de compilacion o advertencia.

Por ejemplo:

//Para verificar algun seting
if (tipoDeUsuario == "Admin")
{
EsAdmin = true;
}
//O para definir un proceso dentro de una funcion
if (proceso == "ExtensionCredito")
{
calcularInteres = true;
}
//Eso seria usado asi...
this.EjecutarCalculoX("ExtensionCredito", clienteId: 567)

Hay un par de maneras de resolver esto.


La primera es el uso de un 'enum':

//Ejemplo A
public enum TipoUsuario
{
Admin,
User
}
//Para verificar un seting
if (tipoUsuario == TipoUsuario.Admin)
{
EsAdmin = true;
}
//Ejemplo B
public enum Operacion
{
ExtensionCredito,
Pago,
VentaActivos
}
//O para definir un proceso dentro de una funcion
if (proceso == Enum.GetName(typeof(Operacion), Operacion.ExtensionCredito))
{
calcularInteres = true;
}
//Eso se podria llamar asi...
this.EjecutarCalculoX(Enum.GetName(typeof(Operacion), Operacion.ExtensionCredito), clienteId: 567)

Sin embargo esta solucion no es suficiente si nuestros 'magic strings' tienen mas de una palabra o un caracter de espacio. Para esas situaciones la manera mas comun de resolverlas es definirlas como constantes string en una clase estatica creada especialmente para almacenarlas :

public static class Operacion
{
public const string ExtensionCredito = "Extension de Credito" ;
public const string Pago = "Pago Hecho" ;
public const string VentaActivo = "Venta de Activos" ;
}
//Asi podemos usar la funcionalidad de esta manera:
if (proceso == Operacion.ExtensionCredito)
{
calcularInteres = true;
}
this.EjecutarCalculoX(Operacion.ExtensionCredito, clientId: 567)


De esa manera tenemos todas nuestras 'magic strings' en un lugar donde las podemos actualizar, si es necesario, sin romper nuestro codigo.


Y eso, amigo mio, es todo!

No comments:

Post a Comment