Train Wreck

Train Wreck

Un tren accidentado nunca es algo bueno 馃殏

3 min read

En los an谩lisis de Clean Code, en la secci贸n de "Objetos y Estructura de datos", nos recomienda evitar el problema llamado "Train Wreck". 驴Qu茅 es? 驴Y c贸mo evitarlo? Lo veremos en este art铆culo.

驴Qu茅 es?

Es una violaci贸n a la Ley de Demeter, y su nombre viene de encadenar varias llamadas que retornan m茅todos o valores de una clase tras otra en profundidad.

Amount paymentAmount = customer.getWallet().getPaymentMethod().getAmount();

El c贸digo anterior responde a un sistema que necesita recibir un pago de parte de un cliente. A simple vista no parece que haya problema 驴verdad?. Llev茅moslo a la vida real.

Una ida al mercado

Supongamos que un d铆a vamos al mercado a comprar un par de cosas para el hogar. Al llegar el momento de pagar, la encargada de la caja mete su mano a mi bolsillo y extrae mi billetera, mira dentro de ella y me pregunta 驴C贸mo pagar谩? Yo felizmente le indico que cancelar茅 en efectivo y saca la cantidad de billetes que necesita y luego me devuelve mi billetera...

驴Bastante extra帽o verdad? 驴y por qu茅 no nos causa extra帽eza realizar lo mismo en el c贸digo anterior?

Refactor

Si volvemos al ejemplo, la cajera tiene toda la l贸gica de c贸mo cancelar茅 la compra y peor a煤n si despu茅s colocamos validaciones si realmente tenemos el dinero que decimos tener. O cu谩l es la tarjeta que seleccionaremos para realizar el pago. Casos que no deben ser del inter茅s de la operadora de caja, sino m谩s bien del cliente.

As铆 que debemos mover la l贸gica del pago al cliente, con sus validaciones, y solo exponer el monto de pago.

Amount paymentAmount = customer.getAmountToPay();

En el m茅todo getAmountToPay() encontraremos la l贸gica de cu谩l es el medio de pago seleccionado y las validaciones del monto a pagar. Incluso validar si el cliente tiene billetera o no (en caso de que la haya extraviado y evitar una excepci贸n por NullPointer).

Conclusiones

El efecto de "Train Wreck" se puede evitar entendiendo en parte la Ley de Demeter, y entendiendo que la l贸gica de los objetos es similar a lo que tenemos en la vida real. A veces a los ni帽os no se les permite hablar con extra帽os y es por una justa raz贸n, pueden entregar m谩s informaci贸n de la que debieran a personas que no deben. Lo mismo en este caso, la l贸gica de validaciones y la cantidad de informaci贸n debe ser manipulada por objetos en contextos cerrados, y s贸lo responder a la pregunta principal cumpliendo otro principio llamado Tell don't Ask, del que hablaremos m谩s adelante.

驴Quieres saber cu谩ntos trenes hay en tu c贸digo?

Ejecuta el siguiente patr贸n de b煤squeda en tu proyecto: \)\..*\(

Gracias por leer! ;)