Salta el contingut
 

Diagrames de classes UML

Autor: Joan Puigcerver Ibáñez

Correu electrònic: j.puigcerveribanez@edu.gva.es

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Nota

En aquest material, s'inclouran fragments de codi :simple-java: Java. L'objectiu d'aquest material NO és aprendre a desenvolupar el codi Java, sinó entendre els conceptes del diagrama de classes i la programació orientada a objectes.

UML

UML és l’acrònim, en anglès, de Unified Modeling Language, és a dir, Llenguatge unificat de modelització. UML són un conjunt de notacions gràfiques que serveixen per especificar, dissenyar, elaborar i documentar models de sistemes i, en particular, d’aplicacions informàtiques. A partir d’aquestes notacions gràfiques o diagrames, l’analista i el dissenyador podran recrear les característiques que caldrà que tingui l’aplicació informàtica que els desenvolupadors hauran de crear posteriorment.

En l’actualitat és el llenguatge de modelització de sistemes més conegut i utilitzat. Gaudeix d’una acceptació pràcticament universal i, entre altres beneficis, ha tingut l’efecte d’impulsar el desenvolupament d’eines de modelització gràfica del programari orientat a l’objectes.

Els avantatges de la notació UML són els següents:

  • Es basa en una notació gràfica concreta i fàcil d’interpretar, sent completada amb explicacions escrites.
  • A l’analista i/o al dissenyador els permet fer ús dels diagrames que consideren oportuns i amb el grau de detall que consideren, en funció de les característiques del sistema.
  • Permet tindre una visió global del sistema a implementar.
  • Promou la reutilització.

Cal tindre en compte que:

  • UML no és una metodologia, és una notació.
  • UML no és un llenguatge de programació.
  • Pot resultar complex obtenir un coneixement complet de les possibilitats del llenguatge.

UML incorpora una gran varietat de diagrames:

Diagrames estàtics

Diagrames estàtics

Institut Obert de Catalunya

Figura 1. Diagrames estàtics

Diagrames dinàmics

Diagrames dinàmics

Institut Obert de Catalunya

Figura 2. Diagrames dinàmics

En aquesta unitat didàctica ens centrarem en els estàtics Diagrames de classes.

Diagrames de classes

Els diagrames de classes són uns diagrames estàtics que mostren les classes i les relacions entre elles. És un dels diagrames més utilitzats en les fases d’anàlisi i de disseny que es basen en UML.

Un diagrama de classes representa les classes que seran utilitzades dins el sistema i les relacions que existeixen entre elles.

Aquest tipus de diagrames són utilitzats durant les fases d’anàlisi i de disseny dels projectes de desenvolupament de programari. És en aquest moment en què es comença a crear el model conceptual de les dades que farà servir el sistema. Per això s’identifiquen els components (amb els seus atributs i funcionalitats) que prendran part en els processos i es defineixen les relacions que hi haurà entre ells.

Un diagrama de classes porta vinculats alguns conceptes que ajudaran a entendre'n la creació i el funcionament en la seua totalitat. Aquests conceptes són:

  • Classe, atribut i mètode (operacions o accions).
  • Visibilitat.
  • Objecte. Instanciació.
  • Relacions. Herència, composició i agregació.
  • Classe associativa.
  • Interfícies.

Resum dels elements d'un diagrama de classes

Institut Obert de Catalunya

Figura 3. Resum dels elements d'un diagrama de classes

Classes. Atributs i mètodes

Una classe és una representació d'un objecte del món real o abstracte, el qual està compost d'atributs, que representen característiques de l'objecte, i els mètodes, que representen les accions de l'objecte.

Es representen amb la notació UpperCamelCase, és a dir, comencen en majúscula i cada paraula comença en majúscula.

Atributs

Els atributs (també anomenats propietats o característiques) són les dades detallades que contenen els objectes. Aquests valors corresponen a l’objecte que instancia la classe i fa que tots els objectes siguen diferents entre si.

Cada atribut té assignat un tipus i una multiplicitat. Es representen amb la notació lowerCamelCase, és a dir, comencen en minúscula i cada paraula comença en majúscula.

El tipus indica la naturalesa de les dades (numèriques, alfanumèriques, booleanes, ...). Els tipus poden ser:

  • Tipus primitius: són els tipus de dades bàsiques que proporciona el llenguatge de programació.
    • int
    • char
    • boolean
    • float
    • ...
  • Tipus derivats: són tipus de dades que es creen a partir de tipus primitius.
    • String
    • Date
    • ...

La multiplicitat indica quants diferents valors poden haver en un atribut:

Possibles valors Significat
1..1 o 1 Exactament un valor. Valor per defecte si no s'especifica cap multiplicitat.
0..* Multiples valors, on es pot donar el cas que no tinga cap.
1..* Multiples valors, però com a mínim un valor.
m..m o m Exactament m valors. Exemple: 3..3 seria exactament 3 valors.
m..n Interval m a n. m valors com a mínim, però no més de n. Exemple: 1..3 seria com a mínim 1 i com a màxim 3.

Mètodes

Els mètodes implementen les accions que es podran dur a terme sobre els atributs. Ofereixen la possibilitat d’aplicar canvis sobre els atributs, però també moltes altres accions relacionades amb l’objecte, com obrir-lo o tancar-lo, carregar-lo, fer càlculs...{.box}

Cada mètode es defineix amb un nom i cal especificar els paràmetres que rep i el valor que retorna.

  • Els paràmetres tenen nom, tipus, multiplicitat.
  • El valor de retorn, si n’hi ha, només té tipus i multiplicitat.

Els mètodes poden llançar Excepcions, que són errors que poden ocórrer durant l'execució de codi. Si el mètode pot llançar alguna excepció concreta, cal indicar-ho.

Representació

Les classes és representen amb un rectangle dividit en 3 apartats:

  • El nom de la classe.
  • Els atributs de la classe. S'especifica la visibilitat i el tipus.
  • Els mètodes de la classe. S'especifica la visibilitat els paràmetres i el tipus del valor de retorn.
classDiagram
    class Persona{
        -DNI: String
        -nom: String
        -adreça: String
        -telefon [0..*]: String
        -dataNaixement: Date
        +edat() int
        +afegirTelefon(telefon : String) void
    }

Figura 4. Representació de la classe Persona

Advertència

L'objectiu d'aquesta unitat és entendre els conceptes de la Programació Orientada a Objectes.

No heu de realitzar la transformació a codi Java. S'adjunta en el material per veure un exemple concret d'implementació d'aquesta estructura.

Transformació a codi Java

Aquesta classe es podria traduir amb el següent codi:

import java.util.List;
import java.util.ArrayList;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.Duration;

public class Persona {
    // Atributs
    private String dni;
    private String nom;
    private String adreça;
    private List<String> telefons;
    private LocalDate dataNaixement;

    // Constructor
    public Persona(String dni, String nom, String adreça, String dataNaixement) {
        this.dni = dni;
        this.nom = nom;
        this.adreça = adreça;
        this.telefons = new ArrayList<>();
        this.dataNaixement = LocalDate.parse(dataNaixement, DateTimeFormatter.ofPattern("dd/MM/yyyy"));
    }

    // Mètodes
    public int edat() {
        LocalDate dataActual = LocalDate.now();
        int days = (int) Duration.between(dataNaixement.atStartOfDay(), dataActual.atStartOfDay()).toDays();
        return days / 365;
    }

    public void afegirTelefon(String telefon) {
        this.telefons.add(telefon);
    }
}

Objectes. Instanciació

Un objecte és una instanciació d’una classe. El concepte instanciació indica l’acció de crear una instància d’una classe.

La creació d’una instància d’una classe es realitza mitjançant una crida al mètode constructor d’una classe en temps d’execució del programa.

Mentre que una classe defineix el disseny conceptual, un objecte és la especificació d'un element d'aquesta classe.

Instanciació de la classe Persona

Instància de la classe Persona

Figura 5. Instància de la classe Persona

A partir de la classe Persona, puc crear diferents objectes utilitzant aquesta estructura, amb diferents valors i independents entre ells.

public class CrearPersones {
    public static void main(String[] args) {
        Persona p1 = new Persona("12345678S", "Joan", "C/Còrsega", "25/07/1988");
        Persona p2 = new Persona("87654321T", "Marta", "Av. Cardenal Benlloch", "01/04/1995");

        p1.afegirTelefon("+34 654876195")

        System.out.printf("Edat de Joan: %d\n", p1.edat());
        System.out.printf("Edat de Marta: %d\n", p2.edat());
    }
}

Visibilitat

La visibilitat d’un atribut o d’un mètode definirà l’àmbit des del qual podran ser utilitzats aquests elements. Aquesta característica està directament relacionada amb el concepte d’orientació a objectes anomenat encapsulació, mitjançant el qual es permet als objectes decidir quina de la seva informació serà més o menys pública per a la resta d’objectes.{.box}

Les possibilitats per a la visibilitat, tant d’atributs com de mètodes, són:

  • + o public, que vol dir que l’element és accessible per tots els altres elements del sistema.
  • - o private, que significa que l’element només és accessible pels elements continguts dins el mateix objecte.
  • # o protected, que vol dir que l’element només és visible per als elements del seu mateix objecte i per als elements que pertanyen a objectes que són especialitzacions (herència).
  • ~ o package, que vol dir que l’element només és visible per als elements continguts ment dins el paquet que on està l’objecte.

En Java es considera una bona pràctica NO definir atributs com a pubilc. Si volem que es puga accedir o modificar algun atributs des d'una altra classe, cal definir el mètode get (getter) i el mètode set (setter).

Els mètodes get i set es poden incloure en el diagrama, però realment no està definit en el model UML.

classDiagram
    class Persona{
        -DNI: String
        «get» -nom: String
        «get/set» -adreça: String
        -telefon [0..*]: String
        -dataNaixement: Date
        +edat() int
    }

Figura 6. Representació de la classe Persona amb getters i setters

public class Persona {
    // Atributs
    private String dni;
    private String nom;
    private String adreça;
    private List<String> telefons;
    private LocalDate dataNaixement;

    // Constructor
    public Persona(String dni, String nom, String adreça, List<String> telefons, String dataNaixement) { ... }

    // Mètodes
    public int edat() { ... }
    }

    // Getters i Setters
    public String getNom(){
        return this.nom;
    }

    public String getAdreça(){
        return this.adreça;
    }
    public void setAdreça(String adreça){
        this.adreça = adreça;
    }
}

Enumeracions

Les enumeracions son classes representen un tipus de dada que sols permet un conjunt definit de valors.

Les enumeracions es representen amb un rectangle amb el nom de la classe en UpperCamelCase, i els valors de l'enumeració es representen amb MAJÚSCULES, ja que es consideren constants.

Exemple d'enumeració

Exemple d'enumeració

Figura 7. Exemple d'enumeració DiaSetmana

En l'exemple, tenim l'enumeració DiaSetmana, que sols permet els valors: DILLUNS, DIMARTS, DIMECRES, DIJOUS, DIVENDRES, DISSABTE i DIUMENGE.

Relacions entre classes

Les relacions en un diagrama de classes especifiquen quines classes estan relacionades. Per relació s'entén que un objecte interactue d'alguna manera amb un altre objecte.{.box}

Exemple de relació entre classes

Podem veure la classe Habitació, que esta relacionada amb la classe Persona, on Habitació conté un objecte Persona com atribut.

Figura 8. Associació entre les classes Habitacio i Persona

Les relacions també tenen assignada una multiplicitat, que especifica amb quants objectes d'una classe es relaciona l'altre objecte de l'altra classe. Les multiplicitats s'especifiquen de la mateixa manera que la multiplicitat dels atributs (consultar taula).

Si una classe té una altra classe com a atribut, estan relacionades i aquest atribut es defineix en la associació entre les dues.

Exemple de relació amb multiplicitat

En l'exemple anterior, es pot observar que una Habitació està relacionada amb una Persona amb una multiplicitat de 1:1..*.

És a dir:

  • Una Habitació està relacionada amb una única Persona, que s'emmagatzema en l'atribut client.
  • Una Persona pot estar relacionada amb més d'una Habitació.

Associació

Les relacions entre les diferents classes, generalment, s'anomenen associacions.

Aquestes relacions es representen mitjançant una línia contínua, sense fletxes ni cap altre símbol als extrems. És un tipus de relació estructural que defineix les connexions entre dos o més objectes.

Una associació amb dos extrems es diu que és binària; seria el cas de l’exemple d’un client que reserva una habitació d’hotel. Una associació amb tres extrems es diu que és ternària.

Exemple d'associació ternària

Institut Obert de Catalunya

Figura 9. Exemple d'associació ternària

Associació reflexiva

Una associació reflexiva és una associació entre una classe amb ella mateixa.

Aquest tipus d'associació és útil per modelar relacions jeràrquiques o recursives.

Exemple d'associació reflexiva

En l'exemple, la classe Categoria pot contindre subcategories, que alhora són de la mateixa classe.

Figura 10. Exemple d'associació reflexiva Categoria

La navegabilitat especifica si una instància d'una classe pot accedir eficientment als objectes de l'altra classe de la relació.

  • No especificat: No s'especifica si es pot navegar d'un objecte a l'altre. Per defecte.
  • Navegable: Especifica que es pot navegar d'un objecte a l'altre. S'indica amb una fletxa oberta al final de la associació.
  • No navegable: Especifica que no es pot navegar d'un objecte a l'altre. S'indica amb una X al final de la associació.

Exemple de navegabilitat en una associació

Institut Obert de Catalunya

Figura 11. Exemple de navegabilitat en una associació

Exemple

En aquest exemple s'indica que A4 pot accedir a B4, però que B4 no pot accedir a A4.

Agregació

Una relació d’associació d’agregació és un cas especial d’associació entre dos o més objectes. Es tracta d’una relació del tipus tot-part. Aquest tipus de relació implica dos tipus d’objectes, l’objecte anomenat base i l’objecte que estarà inclòs a l’objecte base.

Si desapareix l’objecte base, el o els objectes que es troben inclosos en l’objecte base no desapareixeran i podran continuar existint amb les seves funcionalitats pròpies. La relació d’associació d’agregació es representa mitjançant una línia contínua que finalitza en un dels extrems per un rombe buit, sense omplir. El rombe buit s’ubicarà a la part de l’objecte base.

Exemple d'agregació

Institut Obert de Catalunya

Figura 12. Exemple d'agregació

Exemple

L’objecte base és l’objecte anomenat Fruiteria. Els objectes inclosos a la fruiteria són: Pomes, Taronges, Peres i Maduixes. S’estableix una relació entre aquestes classes del tipus tot-part, on les fruites són part de la fruiteria. Això sí, si la fruiteria deixa d’existir, les fruites continuen existint.

Composició

Una relació de composició és un cas especial d’associació entre dos o més objectes. És una relació del tipus tot-part. És una relació molt semblant a la relació d’agregació, amb la diferència que hi ha una dependència d’existència entre l’objecte base i l’objecte (o els objectes) que hi està inclòs.

Si deixa d’existir l’objecte base, deixarà d’existir també el o els objectes inclosos. El temps de vida de l’objecte inclòs depèn del temps de vida de l’objecte base. La relació d’associació de composició es representa mitjançant una línia contínua finalitzada en un dels extrems per un rombe pintat.

Exemple de composició

Figura 13. Exemple de composició

Exemple

L’objecte base Cotxe es compon dels objectes inclosos Volant, Roda, Fre i Deposit. Sense l’objecte Cotxe la resta d’objectes deixaran d’existir.

Dependència

Un altre tipus de relació entre classes és la relació de dependència. Aquest tipus de relació es representa mitjançant una fletxa discontínua entre dos elements. L’objecte del qual ix la fletxa es considera un objecte dependent. L’objecte al qual arriba la fletxa es considera un objecte independent. Es tracta d’una relació semàntica. Si hi ha un canvi en l’objecte independent, l’objecte dependent es veurà afectat.

Exemple de dependència

Figura 14. Exemple de dependència

Exemple

L’objecte Grup es depenent respecte de l'objecte CicleFormatiu.

Per exemple, el Grup DAW1 depén del CicleFormatiu DAW. Si hi ha canvis en la denominació o els continguts del CicleFormatiu DAW, el Grup DAW1 es veurà afectat.

Herència, especialització o generalització

La relació de generalització es dona entre dues classes on hi ha un vincle que es pot considerar d’herència. Una classe és anomenada classe mare o superclasse.

L’altra (o les altres) són les anomenades classes filles, subclasses o especialitzacions, que hereten els atributs, els mètodes i el comportament de la classe mare. Aquest tipus de relació queda especificat mitjançant una fletxa que ix de la classe filla i que acaba a la classe mare.

Exemple de relació de generalització

Figura 15. Exemple de relació de generalització

Exemple

La classe Animal és la classe mare, i les classes Gos i Gat son especialitzacions. Les subclasses contenen els mètodes i atributs de la classe Animal, però cadascuna d'elles poden implementar nous mètodes o tindre nous atributs.

Classe associativa

Quan una associació té propietats o mètodes propis es representa com una classe unida a la línia de l’associació per mitjà d’una línia discontínua. Tant la línia com el rectangle de classe representen el mateix element conceptual: l’associació.

Exemple de classe associativa

Institut Obert de Catalunya

Figura 16. Exemple de classe associativa

Exemple

La classe Estudiant està relacionada amb la classe Assigunatura. Un estudiant pot cursar diverses assignatures, i una assignatura pot ser cursada per molts estudiants. En aquesta associació, cada un dels alumnes té una determinada nota per cada assignatura. Podem modelitzar aquesta situació utilitzant una classe associada.

Recursos addicionals

Exemples

Bibliografia

Aquest material és una obra derivada del material:

Altres referències consultades: