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

Responder

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