viernes, 19 de junio de 2020

Relaciones entre clases

Cuando se diseña un programa se realizan diversos artefactos que nos permiten identificar sus componentes y funcionamiento. Entre ellos tenemos a los diagramas de clases y objetos.

En los lenguajes orientados a objetos como JAVA es fundamental comprender como las clases existentes se relacionan. UML permite definir tres tipos de relaciones fundamentales que son:
  • Asociación
  • Agregación
  • Composición
  • Herencia

Notación de las relaciones entre clases

Tienen las siguientes partes:
  • Nombre de la relación (un verbo).
  • La ocurrencia de cada clase (rangos ubicados en los extremos).
  • El rol de cada clase en la relación.

La multiplicidad es el número de instancias de una clase que se relacionan con una instancia de otra clase.
Multiplicidad Simbología
Uno y solo uno 1
Cero o uno 0 .. 1
Desde "N" hasta "M" N .. M
Varios *
Cero a varios 0 .. *
Uno a varios 1 .. *

Asociación

Es una relación entre dos clases que requieren relacionarse (como una orden y un cliente), mediante UML y el diagrama de clases de representa mediante una línea y en algunos casos incluye una flecha siguiendo la estructura de una oración. Esta flecha apunta al objeto y el otro extremo representa al sujeto.


Relación unidireccional

Código ejemplo

package com.asociacionSimple;

public class Moneda {
    private Integer idMoneda;
    private String nombre;
    private String simbolo;

    public Moneda(Integer idMoneda, String nombre, String simbolo) {
        this.idMoneda = idMoneda;
        this.nombre = nombre;
        this.simbolo = simbolo;
    }

    public String getSimbolo() {return simbolo;}

    public void setSimbolo(String simbolo) {
        this.simbolo = simbolo;
    }

    public Integer getIdMoneda() {return idMoneda;}

    public void setIdMoneda(Integer idMoneda) {
        this.idMoneda = idMoneda;
    }

    public String getNombre() {return nombre;}

    public void setNombre(String nombre) {
        this.nombre = nombre;
    } 
}

package com.asociacionSimple;

public class Producto {
    private Integer idProducto;
    private String codigo;
    private Float precio;
    private Integer stock;
    private Moneda moneda;

    public Producto(Integer idProducto, String codigo, Float precio, Integer stock) {
        this.idProducto = idProducto;
        this.codigo = codigo;
        this.precio = precio;
        this.stock = stock;
    }

    public Moneda getMoneda() {return moneda;}

    public void setMoneda(Moneda moneda) {
        this.moneda = moneda; //Análogo a "agregar moneda"
    }

    public Integer getIdProducto() {return idProducto;}

    public void setIdProducto(Integer idProducto) {
        this.idProducto = idProducto;
    }

    public String getCodigo() {return codigo;}

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public Float getPrecio() {return precio;}

    public void setPrecio(Float precio) {
        this.precio = precio;
    }

    public Integer getStock() {return stock;}

    public void setStock(Integer stock) {
        this.stock = stock;
    }    
}

Relación bidireccional

Agregación

Es un tipo especial de asociación entre clases conocido como: “contiene a” o “es contenido en”. Ambas clases tiene una vida independiente, pero una de estas (llamada invitado) trabaja en orden a otra (huésped). Esto le permite a huésped usar características de invitado en la ejecución de algunas tareas.

Se representa con una línea con rombo blanco, donde el rombo esta en el huésped y el otro lado en el invitado.

Código ejemplo

package com.agregacion;

public class Punto {
    
    private Integer x;
    private Integer y;

    public Punto(Integer x, Integer y) {
        this.x = x;
        this.y = y;
    }

    public Integer getY() {return y;}

    public void setY(Integer y) {this.y = y;}

    public Integer getX() {return x;}

    public void setX(Integer x) {this.x = x;}     
}
package com.agregacion;

public class Figura {
    //Cuadrilatero asumido
    private Punto p1;
    private Punto p2;
    private Punto p3;
    private Punto p4;

    public Figura(Punto p1, Punto p2, Punto p3, Punto p4) {
        this.p1 = p1;
        this.p2 = p2;
        this.p3 = p3;
        this.p4 = p4;
    }

    public Punto getP1() {return p1;}

    public void setP1(Punto p1) {this.p1 = p1;}

    public Punto getP2() {return p2;}

    public void setP2(Punto p2) {this.p2 = p2;}
    
    public Punto getP3() {return p3;}

    public void setP3(Punto p3) {this.p3 = p3;}

    public Punto getP4() {return p4;}

    public void setP4(Punto p4) {this.p4 = p4;}
}

Composición de clases

Tipo especial de agregación. Conocida como "es parte de" o "es un todo de". En este caso las dos partes necesitan de ellas para existir (una no existe sin la otra), de manera que existe una clase (todo) que utiliza características de otra (parte) para la ejecución de alguna tarea.

Se representa con un rombo relleno, que esta junto al "todo" y al otro extremo la "parte".



Código ejemplo

package com.composicion;

public class Vehiculo {

    private Motor motor;
    private Transmision transmision;
    private Rueda ruedaDelantera;
    private Rueda ruedaTrasera;

    public Vehiculo(String motor, String transmision, String ruedaDelantera, String ruedaTrasera) {
        this.motor = new Motor(motor);
        this.transmision = new Transmision(transmision);
        this.ruedaDelantera = new Rueda(ruedaDelantera);
        this.ruedaTrasera = new Rueda(ruedaTrasera);
    }

    public Motor getMotor() {
        return motor;
    }

    public void setMotor(Motor motor) {
        this.motor = motor;
    }

    public Transmision getTransmision() {
        return transmision;
    }

    public void setTransmision(Transmision transmision) {
        this.transmision = transmision;
    }

    public Rueda getRuedaDelantera() {
        return ruedaDelantera;
    }

    public void setRuedaDelantera(Rueda ruedaDelantera) {
        this.ruedaDelantera = ruedaDelantera;
    }

    public Rueda getRuedaTrasera() {
        return ruedaTrasera;
    }

    public void setRuedaTrasera(Rueda ruedaTrasera) {
        this.ruedaTrasera = ruedaTrasera;
    }  
}


1 comentario: