[Clean Code] Evitando Magic Strings

Vuelvo con una nueva entrada aprovechando el MsCoders de esta tarde y esta vez quiero hablar sobre los Magic Strings.

Seguro que más de una vez te has pasado un buen rato navegando por el código para cambiar valores de literales y algún bug que otro ha aparecido cuando en una parte de tu código el valor de un literal no es el mismo en otra parte de tú código, verdad? Esto es lo que se denominan Magic Strings (En otra entrada veremos que son los Magic Numbers). Esta entrada te puede parecer trivial, pero seguro que si ahora mismo revisas tu código te encuentras fijo con mas de uno, verdad?

El problema de usarlos está muy claro y te lo voy a mostrar con un ejemplo:

Código sacado de StackOveflow:

mainMenu.MenuItems["View"].MenuItems["FullScreen"].Visible = true;

El problema radica en que si mañana el menu item  “View” pasa a llamarse “ViewData” tendremos que buscar en todo el código en que parte estamos haciendo uso de el y rezar de que no se nos olvide cambiarlo en ningún lado porque nos encontraremos un error en ejecución. Otra puede ser que en una parte del código lo pongamos con minúsculas y en otro con mayúsculas y así nuemerosas posibilidades que todas acaban en lo mismo, dolor.

¿Como se soluciona?

Pues de 2 maneras y las 2 son totalmente válidas:

  • Constantes
  • Recursos

La primera es muy utilizada y la segunda yo no la usaba hasta hace relativamente poco tiempo, desde que Unai me comentó un día como lo hacía el equipo de producto de Entity Framework. Ellos se han montado un plantilla T4 que lee de un fichero de recursos y generar por decirlo de alguna manera ese fichero de constantes. Seguro que piensas que para eso me ahorro la T4 y me genero yo el fichero, verdad? Pero lo bueno es que interpreta también los strings con parámetros de formato y genera métodos con argumentos. Te lo muestro:

image

Yo en este momento estoy trabajando en una aplicación que genera SQL Dinámico y necesito de ciertas consultas que no quiero tenerlas en el código como Magic Strings:

image

Una vez que añades la entrada a los recursos, ejecutas la T4:

image

Y ya tienes listo el método parametrizado:

image

Así pues lo uso para estos casos y para strings como vimos en el caso anterior me viene muy bien.

Un saludo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *