Aislar y abstraer
Este es un principio de programación propio muy sencillo pero que trae muchos beneficios. Seguro que no es totalmente «propio» y tiene algún nombre en algún manual, pero es algo que suelo hacer por iniciativa propia.
Cuando estás tomando decisiones con estructuras condicionales -por ejemplo mostrar/ocultar elementos de la interfaz- en diversas partes del mismo documento -controlador, vista, etc- tienes que expresar en cada condición lo que quieres o no quieres hacer, sin basar esa condición en información o estados anteriores. Es decir, que si lo que quieres es mostrar o no un widget con un mapa, simplemente pregunta:
if (mostrarMapa) { ...
Y deja que otras secciones del código se ocupen de elaborar el resultado final de la variable mostrarMapa
. Vamos a ver por qué es ventajoso.
Supongamos un controlador de cualquier framework MVC para una aplicación de venta de cualquier objeto físico que requiera transporte, la típica tienda. El usuario, en función del estado del pedido, tiene la oportunidad de ver en un mapa el punto en el que se encuentra éste.
Supongamos que queremos cargar toda la parafernalia (javascript, etc) solo si hay posibilidad de mostrar el mapa, con objeto de ahorrar ese ancho de banda si no es posible mostrarlo en ese momento. La aproximación normal a este problema es:
En la sección de la vista que prepara el html del mapa (ejemplos en Blade de Laravel):
@if (pedido.estado == 'ruta')
<div id="mapa">...
@endif
En la sección de la vista que declara el css:
@if (pedido.estado == 'ruta')
<link rel="stylesheet">...
@endif
Y en la sección que prepara el código javascript:
@if (pedido.estado == 'ruta')
<script type="text/javascript">...
@endif
Esto funciona, pero ¿qué pasa si cambian las condiciones para mostrar o no el mapa? Pues que tengo que revisar en toda la plantilla y en todo el proyecto todos aquéllos condicionales que preguntaban directamente por el estado del pedido. Es necesario abstraer el dato en otra variable o, mejor aún, siguiendo los principios de la programación funcional en una función. Si la condición para mostrar el mapa se vuelve:
@if ((pedido.estado == 'ruta' and pedido.necesitaTransporte))
Entonces tengo un problemón. Pero si diseño una función accesible tanto desde los controladores como desde la vista, que sea por ejemplo mostrarMapa(pedido)
, solo tengo que modificar esa función para que todo el proyecto quede consistente. Aísla unas secciones de código de otras tanto como te sea posible.
function mostrarMapa(pedido)
{
return pedido.estado == 'ruta' and pedido.necesitaTransporte;
}
Perpetrado el 02 de agosto de 2017 por una IN (Inteligencia Natural), la mia, con cierto esfuerzo.
Archivado en categoría(s) Programación
Deja una respuesta