Conceptos básicos de Java & Spring Framework – Cohesión, Acoplamiento, POJO

Antes de entrar de lleno al tema de Spring me gustaría abordar algunos temas previos que considero necesario dominar para empezar a aprender esta herramienta de desarrollo (Spring framework). Quizas pienses que es aburrido o son largas las explicaciones pero te aseguro que aprender esto en el futuro te dará muchas satisfacciones (sobre todo económicas) y dominaras más fácilmente los temas posteriores. Además, nunca dije que programar de manera profesional fuera súper fácil ¿o si?.

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

/*
 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

/*
 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

/*
 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 
     *

    *
  • {@link java.math.BigInteger BigInteger} El cual es el número de la tarjeta
  • *
  • null Si el número de tarjeta no ha sido asignado
  • *
*/ public BigInteger getNumero() { return numero; } public void setNumero(BigInteger numero) { this.numero = numero; } /** * Nombre de la tarjeta, ejemplo: Súper nomina ó Cochinito * @return *
    *
  • {@link java.lang.String String} El cual es el nombre de la tarjeta
  • *
  • null Si el nombre de la tarjeta no ha sido asignado
  • *
*/ public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } /** * Tipo de tarjeta, ejemplo: VISA ó MASTERCARD * @return *
    *
  • {@link java.lang.String String} El cual es el tipo de la tarjeta
  • *
  • null Si el tipo de la tarjeta no ha sido asignado
  • *
*/ public String getTipoTarjeta() { return tipoTarjeta; } public void setTipoTarjeta(String tipoTarjeta) { this.tipoTarjeta = tipoTarjeta; } /** * Nombre del banco al que pertenece la tarjeta * @return *
    *
  • {@link java.lang.String String} El cual es el nombre del banco
  • *
  • null Si el nombre del banco no ha sido asignado
  • *
*/ 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 *
    *
  • {@link java.lang.Short Short} El cual es el año de la fecha de expiracion
  • *
  • null Si el año de expiración no ha sido asignado
  • *
*/ public Short getFechaExpiracionAnio() { return fechaExpiracionAnio; } public void setFechaExpiracionAnio(Short fechaExpiracionAnio) { this.fechaExpiracionAnio = fechaExpiracionAnio; } /** * Mes de la fecha de expiración. Dos digitos * @return *
    *
  • {@link java.lang.Byte Byte} El cual es el mes de la fecha de expiracion
  • *
  • null Si el mes de expiración no ha sido asignado
  • *
*/ public Byte getFechaExpiracionMes() { return fechaExpiracionMes; } public void setFechaExpiracionMes(Byte fechaExpiracionMes) { this.fechaExpiracionMes = fechaExpiracionMes; } /** * Código de verificación de la tarjeta, generalmente impreso * en el reverso de la tarjeta en el área de la firma. Tres dígitos * @return *
    *
  • {@link java.lang.Short Short} El cual es código de verificación de la tarjeta
  • *
  • null Si el código de verificación de la tarjeta no ha sido asignado
  • *
*/ 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 *
    *
  • true si la tarjeta SI es de débito
  • *
  • false si la tarjeta NO es de débito
  • *
*/ 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 *
    *
  • true si la tarjeta SI es de crédito
  • *
  • false si la tarjeta NO es de crédito
  • *
*/ 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.