Patrón Value Object

Publicado por Iván Gajate el 17 de mayo de 2009 en AS3, Flash, Patrones de diseño, Tutoriales

Este mini patrón de diseño, consiste simplemente en agrupar varios valores dentro de un objeto para enviarlo y recibirlo con mayor comodidad/seguridad.

Yo casi más que un patrón lo considero una buena costumbre de programación, y es que cuando tengo que pasarle a una función mas de 4 ó 5 parámetros, los meto todos en un objeto y hago que esta función sólo espere ese objeto como único parámetro.

// Sin Value Object
public function guardarDatos(nombre:String, apellidos:String, edad:uint, hombre:Boolean):void{
	//
}

// Con Value Object
public function guardarDatos(datos:Object):void{
	//
}

Esto, aparte de hacer el código más legible, hace nuestro programa escalable, pues si en un futuro queremos añadir un nuevo parámetro a la función, no tengo que cambiar su firma (public function guardarDatos(datos:Object):void), sino que le añado una nueva propiedad al objeto y listo, mi función sigue esperando un sólo parámetro.

 

Sin embargo al utilizar un objeto de tipo Object nos surgen varios problemas:

  • El tipado de datos desaparece, pues es de tipo Object. Demasiado genérico.
  • No me aporta ningún conocimiento ni control sobre los valores que viajan dentro.
  • Es feo e inseguro pasar todos estos valores por separado de una función a otra.

La solución pasa por crearme un Value Object para cada tipo de dato que quiera emitir, y hacer que mi función guardarDatos lo reciba como parámetro.

package {

	public class DatosVO {
		
		public var nombre:String;
		public var apellido:String;
		public var edad:uint;
		public var hombre:Boolean;

		public function DatosVO() {
			
		}
		
		// Puedo implementar un metodo toString para que muestre los datos del objeto con cierto formato
		public function toString():String{
			return "[DatosVO nombre:"+nombre+", apellido:"+apellido+", edad:"+edad+", hombre:"+hombre+"]";
		}

	}
}

Ahora para hacer una llamada a guardarDatos antes tengo que crear un objeto de tipo DatosVO:

var datos:DatosVO = new DatosVO();
datos.nombre = "Iván";
datos.apellido = "Gajate";
datos.edad = 31;
datos.hombre = true;
			
guardarDatos(datos);

Y nuestra función guardarDatos ahora espera un objeto de tipo DatosVO, con lo que el tipado de datos está asegurado y me arrojará errores si me equivoco en algo.

private function guardarDatos(datos:DatosVO):void{
	trace(datos.nombre);
}

Además, tengo conocimiento del tipo de dato que me llega, de tipo DatosVO, me permite comprobarlo e incluso pasarlo de una función a otra, y todas saben el tipo de dato esperado.

Nota: He incluido una función toString en mi clase, que es invocada por defecto cuando hacemos un trace(datos) y así puedo ver los datos del objeto con un formato mas amigable.

También podríamos haber utilizado Getters y Setters en lugar de variables públicas, pero dada la sencillez de la clase no me ha parecido necesario.

 

18 comentarios para “Patrón Value Object”

  1. gracias por la info, corta y al grano … como debería ser una explicación

  2. Buen aporte, queda claro la utilidad de este mini patron