Cadena de responsabilidad con JavaScript

Ya que estamos por acá y hacía mucho que no publicaba nada, vamos con un ejercicio práctico rápido.

Una de las cosas que me gustan, y mucho, de escribir código son los patrones de diseño. Esas piezas de código que solucionan algún problema particular de forma elegante.

Hay miles, pero tal vez los más recordados sean los propuestos por el GoF. Patrones que muchas veces usamos sin saberlo o hemos escuchado y mal usado (Porque es el único que recordamos) en todos lados (Ejem… singleton).

Así que, no vamos a hacer un singleton, si no, una cadena de responsabilidades.

Para este caso, hay un par de formas de hacerla pero a la larga es más o menos lo mismo, así que vamos con una forma bastante clásica. Esto es: Teniendo una clase base particular, creamos otras que tendrán tareas específicas y heredan de la base. En cada una de las clases realizaremos una validación o tarea o “responsabilidad“, para luego pasarle la responsabilidad a la siguiente parte de dicha cadena. Si un eslabón falla, la cadena falla. Es un todo o nada.

Suele ser muy útil para validar contraseñas o aplicar reglas a un objeto, tener las reglas separadas y encapsuladas (No una masa de ifs) y poder encadenar dicha cadena de la forma en que nos de la gana. Incluso por código, pudiendo cambiar el comportamiento de la misma sin tener que modificar línea alguna.

En este caso, para ahorrarme algo de código he usado la librería ExtendJS, que permite crear una herencia al estilo de lenguajes como Java o C#, pero por debajo usa prototipos y demás dulzuras de JavaScript.

Lo primero, la clase base:


var chainBase = Class.extend(function(){
this._next = null;
this.goNext = function (value) {
if (this._next !== null) {
this._next.validate(value);
}
};
this.validate = function (value) {};
});

La clase base tiene una propiedad _next donde alojaremos el siguiente eslabón de la cadena, una función goNext para ahorrarnos escribir el código de movernos por la cadena en cada eslabón y una función validate que luego será sobre escrita en las demás clases.

var charMin = chainBase.extend(function () {
this.super();
this.validate = function (value) {
if (value.length < 3) {
throw "No es sufientemente largo";
}
this.goNext(value);
};
});

El primer eslabón se encarga de validar que el largo de nuestro texto a validar no sea superior a los 3 caracteres. Si todo está en orden entonces pasará la tarea al siguiente. Por lo que necesitaremos otro eslabón.

var charMax = chainBase.extend(function () {
this.super();
this.validate = function (value) {
if (value.length > 10) {
throw "Es muy largo";
}
this.goNext(value);
};
});

Este verificará que el largo no supere los 10 caracteres y si todo está bien, pasará al siguiente eslabón.

Podremos crear tantos validadores como creamos necesarios y luego enlazarlos.


var a = new charMin(),
b = new charMax();
a._next = b;
a.validate('abcd');


One Comment on “Cadena de responsabilidad con JavaScript”

  1. […] Cadena de responsabilidad con JavaScript → […]


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s