Sobre la cohesión y el Acoplamiento
Entre las características de Spring mencionadas anteriormente mencione estos dos términos, que considero especialmente importantes, a continuación una breve explicación:
Cohesión
En ingeniería de software la cohesión se refiere al nivel de fortaleza y unidad con la que diferentes componentes de un programa están interrelacionados entre ellos. Ha permanecido como una norma en esta ingeniería que para una buena programación o un buen diseño es que la cohesión debe ser alta. Es decir, mientras más cohesionados estén los elementos agrupados, mejor. Por ejemplo, en la POO cohesión es enfocar de la forma más precisa el propósito de una clase, delegando las tareas complementarias a otros componentes, cuanto mayor enfoquemos el propósito de una clase, mayor será su cohesión.
Acoplamiento
El acoplamiento mide el grado de relacionamiento de un módulo con los demás. A menor acoplamiento, mejor: el módulo en cuestión será más sencillo de diseñar, programar, probar y mantener. En la POO, una clase tendrá bajo acoplamiento cuando tenga la menor dependencia posible de otras clases. Una acoplamiento alto significa que las clases relacionadas necesitan saber detalles internos unos de otros (dependen entre sí), cuando el sistema crece y los cambios se propagan, el sistema es posiblemente más difícil de entender y mantener.
¿Qué es un POJO?
Nuevamente tomando la definición de la Wikipedia; Un POJO (acrónimo de Plain Old Java Object), es una nueva palabra para designar algo viejo, tan viejo como una tarjeta perforada. En java un objeto POJO es una instancia de una clase que no extiende ni implementa nada en especial. Es decir, es una clase con sus atributos privados y sus correspondientes getters y setters públicos. Un setter es un método que establece el valor de un atributo, mientras que un getter es un método que devuelve su valor. Con algunos ejemplos quedara claro esto:
Usuario.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
/* www.notas-programacion.com Descripción: Ejemplo de un POJO Archivo: Usuario.java */ package com.notasprogramacion.pojos; public class Usuario { //atributos private Integer idUsuario; private String nombre; private String apPaterno; private String apMaterno; private int edad; //getters y setters public int getIdUsuario() { return idUsuario; } public void setIdUsuario(Integer idUsuario) { this.idUsuario = idUsuario; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getApPaterno() { return apPaterno; } public void setApPaterno(String apPaterno) { this.apPaterno = apPaterno; } public String getApMaterno() { return apMaterno; } public void setApMaterno(String apMaterno) { this.apMaterno = apMaterno; } public String getNombreCompleto() { return nombre + " " + apPaterno + " " + apMaterno; } public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } } |
Observa como todos los atributos de la clase anterior son privados y los setters y getters son públicos, además, la clase no extiende ni implementa a ninguna otra clase. A este tipo de clases se les conoce como POJOs. Algunos ejemplos más:
Producto.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
/* www.notas-programacion.com Descripción: Ejemplo de un POJO Archivo: Producto.java */ package com.notasprogramacion.pojos; import java.math.BigDecimal; import java.util.Date; public class Producto { //atributos private Integer idProducto; private String nombre; private String descripcion; private BigDecimal precioProveedor; private BigDecimal precioPublico; private Date fechaCaducidad; //getters y setters public Integer getIdProducto() { return idProducto; } public void setIdProducto(Integer idProducto) { this.idProducto = idProducto; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getDescripcion() { return descripcion; } public void setDescripcion(String descripcion) { this.descripcion = descripcion; } public BigDecimal getPrecioProveedor() { return precioProveedor; } public void setPrecioProveedor(BigDecimal precioProveedor) { this.precioProveedor = precioProveedor; } public BigDecimal getPrecioPublico() { return precioPublico; } public void setPrecioPublico(BigDecimal precioPublico) { this.precioPublico = precioPublico; } public Date getFechaCaducidad() { return fechaCaducidad; } public void setFechaCaducidad(Date fechaCaducidad) { this.fechaCaducidad = fechaCaducidad; } @Override public String toString() { return "Producto{" + "idProducto=" + idProducto + ", nombre=" + nombre + ", descripcion=" + descripcion + ", precioProveedor=" + precioProveedor + ", precioPublico=" + precioPublico + ", fechaCaducidad=" + fechaCaducidad + '}'; } } |
Tarjeta.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
/* www.notas-programacion.com Descripción: Ejemplo de un POJO Archivo: Tarjeta.java */ package com.notasprogramacion.pojos; import java.math.BigInteger; /** * Clase para encapsular los datos de una tarjeta bancaria * @author notaspro - www.notas-programacion.com * @version 1.0 * Última actualización: 02-10-2014 por notaspro */ public class Tarjeta { //atributos private BigInteger numero; private String nombre; private String tipoTarjeta; private String nombreBanco; private Short fechaExpiracionAnio; private Byte fechaExpiracionMes; private Short codigoVerificacion; private boolean isDebito; private boolean isCredito; //getters y setters /** * Número de tarjeta * @return * <ul> * <li><strong>{@link java.math.BigInteger BigInteger}</strong> El cual es el número de la tarjeta</li> * <li><strong>null</strong> Si el número de tarjeta no ha sido asignado</li> * </ul> */ public BigInteger getNumero() { return numero; } public void setNumero(BigInteger numero) { this.numero = numero; } /** * Nombre de la tarjeta, ejemplo: Súper nomina ó Cochinito * @return * <ul> * <li><strong>{@link java.lang.String String}</strong> El cual es el nombre de la tarjeta</li> * <li><strong>null</strong> Si el nombre de la tarjeta no ha sido asignado</li> * </ul> */ public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } /** * Tipo de tarjeta, ejemplo: VISA ó MASTERCARD * @return * <ul> * <li><strong>{@link java.lang.String String}</strong> El cual es el tipo de la tarjeta</li> * <li><strong>null</strong> Si el tipo de la tarjeta no ha sido asignado</li> * </ul> */ public String getTipoTarjeta() { return tipoTarjeta; } public void setTipoTarjeta(String tipoTarjeta) { this.tipoTarjeta = tipoTarjeta; } /** * Nombre del banco al que pertenece la tarjeta * @return * <ul> * <li><strong>{@link java.lang.String String}</strong> El cual es el nombre del banco</li> * <li><strong>null</strong> Si el nombre del banco no ha sido asignado</li> * </ul> */ public String getNombreBanco() { return nombreBanco; } public void setNombreBanco(String nombreBanco) { this.nombreBanco = nombreBanco; } /** * Año de la fecha de expiración. Cuatro dígitos * @return * <ul> * <li><strong>{@link java.lang.Short Short}</strong> El cual es el año de la fecha de expiracion</li> * <li><strong>null</strong> Si el año de expiración no ha sido asignado</li> * </ul> */ public Short getFechaExpiracionAnio() { return fechaExpiracionAnio; } public void setFechaExpiracionAnio(Short fechaExpiracionAnio) { this.fechaExpiracionAnio = fechaExpiracionAnio; } /** * Mes de la fecha de expiración. Dos digitos * @return * <ul> * <li><strong>{@link java.lang.Byte Byte}</strong> El cual es el mes de la fecha de expiracion</li> * <li><strong>null</strong> Si el mes de expiración no ha sido asignado</li> * </ul> */ public Byte getFechaExpiracionMes() { return fechaExpiracionMes; } public void setFechaExpiracionMes(Byte fechaExpiracionMes) { this.fechaExpiracionMes = fechaExpiracionMes; } /** * Código de verificación de la tarjeta, generalmente impreso <br/> * en el reverso de la tarjeta en el área de la firma. Tres dígitos * @return * <ul> * <li><strong>{@link java.lang.Short Short}</strong> El cual es código de verificación de la tarjeta</li> * <li><strong>null</strong> Si el código de verificación de la tarjeta no ha sido asignado</li> * </ul> */ public Short getCodigoVerificacion() { return codigoVerificacion; } public void setCodigoVerificacion(Short codigoVerificacion) { this.codigoVerificacion = codigoVerificacion; } /** * Valor booleano para saber si la tarjeta es de débito * @return * <ul> * <li><strong>true</strong> si la tarjeta SI es de débito</li> * <li><strong>false</strong> si la tarjeta NO es de débito</li> * </ul> */ public boolean getIsDebito() { return isDebito; } public void setIsDebito(boolean isDebito) { this.isDebito = isDebito; } /** * Valor booleano para saber si la tarjeta es de crédito * @return * <ul> * <li><strong>true</strong> si la tarjeta SI es de crédito</li> * <li><strong>false</strong> si la tarjeta NO es de crédito</li> * </ul> */ public boolean getIsCredito() { return isCredito; } public void setIsCredito(boolean isCredito) { this.isCredito = isCredito; } @Override public String toString() { return "Tarjeta{" + "numero=" + numero + ", nombre=" + nombre + ", tipoTarjeta=" + tipoTarjeta + ", nombreBanco=" + nombreBanco + ", fechaExpiracionAnio=" + fechaExpiracionAnio + ", fechaExpiracionMes=" + fechaExpiracionMes + ", codigoVerificacion=" + codigoVerificacion + ", isDebito=" + isDebito + ", isCredito=" + isCredito + '}'; } } |
Los POJOs también pueden documentarse con JavaDoc como se observa en el último ejemplo (Tarjeta.java), esta práctica es sumamente recomendable porque luego entre tantas clases se olvida para que sirve cada atributo. Un método que recomiendo sobrescribir es toString() para saber qué datos tiene encapsulados el POJO en un determinado momento. Recordemos que por defecto en java todos los objetos tienen el método toString().
Por si te interesa tener los códigos fuente expuestos anteriormente, he subido el proyecto de Netbeans en un repositorio de GitHub aqui. En la próxima entrega hablare sobre las interfaces en java, explicare que son, con algunos ejemplos mostrare como declararlas y como usarlas. Te invito a que me dejes un comentario si te gusto el POST.
Hasta la pronto.