Principi di Progettazione del Software a.a. 2017-2018 - UML: approfondimenti sui diagrammi delle classi e di sequenza. Diagrammi di package e di ...

Pagina creata da Roberta Franchini
 
CONTINUA A LEGGERE
Principi di Progettazione del Software
               a.a. 2017-2018

UML: approfondimenti sui diagrammi delle classi e di
 sequenza. Diagrammi di package e di deployment
                Prof. Luca Mainetti
               Università del Salento
Obiettivi della lezione

■ Approfondire alcuni concetti relativi ai diagrammi delle
    classi e ai diagrammi di sequenza
■ Introdurre i diagrammi dei package e di deployment
■ Comprendere come utilizzare i diagrammi sopra elencati
    per progettare/documentare l’architettura software delle
    applicazioni di interesse per il corso di Principi di
    Progettazione del Software

Approfondimenti diagrammi UML             2               Luca Mainetti
Diagramma delle classi

■ E’ la tipologia di diagramma più ricorrente (e forse più utile)
    di UML
■ Un diagramma delle classi può essere utilizzato per
    modellare concetti oppure per modellare software
■ Nel secondo caso, descrive il tipo degli oggetti (classi) che
    fanno parte di un sistema software e le relazioni che li
    legano
■ Per ogni classe, il diagramma descrive le corrispondenti
    caratteristiche (feature), cioè le proprietà e le operazioni
    che la compongono

Approfondimenti diagrammi UML       3               Luca Mainetti
Un esempio di diagramma delle classi
              Ordine
      -data: Data [0..1]                                                                                         Cliente
      -prepagato: Boolean [1]
                                                                                                     -nome [1]
      -numero: String [1]
                                                                                                     -indirizzo [0..1]
      -prezzo: Denaro               *                                                          1     +getiLivelloCredito() : String
      +spedisci()
      +chiudi()

              1

                        {if Ordine.cliente.getLivelloCredito() == "basso"
                        then Ordine.prepagato = true}                                 AziendaCliente                          ClientePrivato
                                                                                -nomeContatto                              -numeroCartaCredito
    {ordered} *      -elementiLinea                                             -livelloCredito
                                                                                -limiteCredito
           LineaOrdine                                                          +contoMensile(in c : Integer)
                                                                                +sollecito()
         -quantita: integer
         -prezzo: Denaro
                                                                                           *
                                                                                                                {getLivelloCredito() == "basso"}
              *

              1                                                                         0..1       -rappresentante

             Prodotto                                                                    Impiegato

Approfondimenti diagrammi UML                                               4                                              Luca Mainetti
Proprietà

■ Le proprietà di una classe ne definiscono la struttura
■ In prima approssimazione corrispondono ai campi della
    classe
■ Le proprietà possono essere rappresentate con due
    notazioni differenti
     – Attributi
          • Tipicamente utilizzati per rappresentare dati semplici
     – Associazioni
          • Tipicamente utilizzati per rappresentare dati complessi (altre classi)

Approfondimenti diagrammi UML             5                          Luca Mainetti
Attributi

■ Sintassi completa
   – visibilità nome: tipo molteplicità = default
         {stringa-di-proprietà}
■ Esempio
   – - titolo: String [1] = “UML distilled” {readOnly}
■ Elementi
   – visibilità: (-) private, (#) protected, (+) public
   – nome: nome dell’attributo
   – tipo: tipo di dato di un campo di programmazione
   – molteplicità: numero di valori ammessi per le istanze
   – default: valore di default in un oggetto appena creato
   – {stringa-di-proprietà}: alcune caratteristiche aggiuntive

Approfondimenti diagrammi UML      6                      Luca Mainetti
Associazioni

■ Un’associazione è una linea
    continua che collega due classi                            Ordine
■ E’ orientata dalla classe               -data: Data [0..1]
  sorgente a quella destinazione          -prepagato: Boolean [1]
■ La classe destinazione                  -elementiLinea: LineaOrdine [*] {ordered}
  corrisponde al tipo della
  proprietà
■ La rappresentazione con
    associazioni descrive in modo
    più intuitivo l’architettura            Data
                                                   -data
                                                                 Ordine
                                                                                 -prepagato
                                                                                                 Boolean
                                                   0..1    *                               1
■ Dal punto di vista implementativo                             1

    la rappresentazione con                                      *    -elementiLinea {ordered}

    associazioni è equivalente alla
                                                               LineaOrdine
    rappresentazione con attributi

Approfondimenti diagrammi UML         7                                   Luca Mainetti
Molteplicità

■ La molteplicità indica quanti oggetti possono entrare a far parte di una
    proprietà (attributo o associazione)
■ Sintassi
     – [min..max]
■ Esempi
     – Opzionale: [0]
     – Obbligatorio: [1..1], [1]
     – Singolo: [0..1]
     – Multiplo: [0..*], [1..*], [*]
■ Se una proprietà ha più valori si possono specificare proprietà
    aggiuntive come {ordered}, {unordered}
■ La molteplicità di default di un attributo è [1]

Approfondimenti diagrammi UML        8                      Luca Mainetti
Proprietà e codice Java

■ Non vi è una diretta                   public class LineaOrdine …
    corrispondenza tra UML e                private int quantita;
    codice, ma una analogia                 private Prodotto prodotto;
                                            public int getQuantita(){
■ Ad esempio, le proprietà
                                                 return quantita;
    possono essere implementate
                                            }
    come campi privati (a) o come
                                            public int setQuantita(int q){
    operazioni (b)
                                                 this.quantita = q;
                                            }
public class LineaOrdine …
                                           public Money getPrezzo(){
    private int quantita;                       return prodotto.
    private Denaro prezzo;                      getPrezzo().
                                                multiply(quantita);
    private Ordine ordine;                 }
    private Prodotto prodotto;
                  (a)                                    (b)

Approfondimenti diagrammi UML        9                         Luca Mainetti
Operazioni

■ Sintassi completa
   – visibilità nome (lista-parametri): tipo-di-ritorno
     {stringa-di-proprietà}
■ Esempio
     – + saldo (data: Data): Denaro
■ Elementi
     – visibilità: (-) private, (#) protected, (+) public
     – nome: nome dell’operazione
     – lista-parametri: direzione nome: tipo = default
          • nome, tipo, valore di default sono analoghi a quelli degli attributi
          • direzione: in, out, inout
     – tipo-di-ritorno: è il tipo del valore restituito
     – {stringa-di-proprietà}: alcune caratteristiche aggiuntive

Approfondimenti diagrammi UML                10                             Luca Mainetti
Generalizzazione

■ La generalizzazione modella il concetto di supertipo/sottotipo
     – Ad esempio: Cliente/AziendaCliente
     – AziendaCliente è un sottotipo di Cliente se tutte le istanze della prima classe
       sono anche istanze della seconda
■ Dal punto di vista software
     – La generalizzazione modella l’ereditarietà per molti linguaggi a oggetti
     – Un concetto di base per l’ereditarietà è il principio di sostituibilità di
       Liskov: dovrebbe essere sempre possibile sostituire AziendaCliente in tutti i
       punti in cui il codice richiede Cliente e tutto dovrebbe continuare a
       funzionare
     – Per ottenere sottoclassi sostituibili è bene fare riferimento al concetto di
       ereditarietà di interfaccia oppure a design patterns piuttosto che
       all’ereditarietà di classe (Gamma, Helm, Johnson, Vlissides — Design
       patterns — Addison-Wesley 2002)

Approfondimenti diagrammi UML            11                          Luca Mainetti
Dipendenza
■ La classe A (client) dipende dalla
    classe B (supplier) se ogni modifica                            UI Prodotto
    a B può implicare una modifica ad A
     – A chiama metodi di B
     – A usa B come tipo di un suo attributo
     – A usa B come tipo in una sua
       operazione
■ E’ importante minimizzare le
  dipendenze
                                                                     Prodotto
■ E’ fondamentale evitare dipendenze
  cicliche
■ Molte relazioni UML implicano una
  dipendenza
     – Un’associazione navigabile (es:
       Ordine dipende da Cliente)
     – Una generalizzazione (es:
       AziendaCliente dipende da Cliente)        Gateway dei dati                 Gateway dei dati
                                                     Offerte                         Prodotto

Approfondimenti diagrammi UML               12                              Luca Mainetti
Tipologie di dipendenze UML

                La sorgente invoca un’operazione della destinazione

              La sorgente crea un’istanza della destinazione

              La sorgente è derivata dalla destinazione
                        La sorgente è un’istanza della destinazione. Poiché la sorgente è una
         classe, la destinazione deve essere una meta-classe

              La destinazione permette alla sorgente di accedere ai suoi campi privati

             La sorgente è un’implementazione di un’interfaccia della destinazione

              Raffinamento tra livelli semantici, ad esempio tra analisi e progettazione

          La sorgente è sostituibile alla destinazione

               Usata per tenere traccia di cose come i requisiti

                 La sorgente richiede la destinazione per la sua implementazione

Approfondimenti diagrammi UML                 13                             Luca Mainetti
Vincoli

■ Quando si definiscono diagrammi delle classi, di fatto si
    definiscono dei vincoli
■ Ad esempio, un Ordine può essere creato solamente da un
    singolo Cliente
■ I costrutti UML come attributi, associazioni, generalizzazioni
    permettono di catturare i vincoli più importanti
■ Altri vincoli possono essere espressi in vari modi (tra
    parentesi graffe e all’interno di note)
     – In linguaggio naturale
     – In qualche pseudo linguaggio
     – In OCL (Object Constraint Language), che è basato sul calcolo dei
       predicati

Approfondimenti diagrammi UML      14                     Luca Mainetti
Come usare i diagrammi delle classi

■ Stabilire il livello di modellazione
   – Concettuale (modellazione di concetti)
   – Logica (modellazione dei software)
■ Stabilire l’interpretazione da dare alle classi UML
     – Classi di analisi (modello nello spazio dei requisiti)
     – Classi del software (modello nello spazio della soluzione)
■ Procedimento
     – Non utilizzare subito tutti i costrutti disponibili, ma concentrarsi in prima
       istanza su classi, associazioni, attributi, generalizzazioni, dipendenze,
       vincoli
     – Fare diagrammi delle classi solamente per le cose rilevanti
     – Non concentrarsi solamente sulla struttura, ma sviluppare in parallelo
       diagrammi delle classi e diagrammi comportamentali (diagrammi di
       sequenza)

Approfondimenti diagrammi UML             15                          Luca Mainetti
Profili

■ Un profilo è una personalizzazione del meta-modello UML
■ E’ conveniente definire dei profili quando è rilevante
    introdurre concetti specifici di alcuni domini
■ Tecnicamente un profilo UML è
     – Un insieme di stereotipi
     – Un insieme di vincoli
     – Un insieme di tagged value (coppia attributo valore)
■ Tipicamente i profili vengono utilizzati per creare nuovi
    linguaggi a partire da UML
     – La WAE (Web Application Extension) è una personalizzazione di
       UML per la progettazione di applicazioni web

Approfondimenti diagrammi UML      16                         Luca Mainetti
Visualizzare le responsabilità delle classi

          Vista                                                     Modello
 -- visualizza i dati                                       -- gestisce la logica
    del modello                                                del dominio e lo stato

                                      Controllore
                                -- gestisce l'interazione
                                   col sistema

Approfondimenti diagrammi UML                17                        Luca Mainetti
Aggregazione e composizione

■ E’ importante comprendere la
    differenza tra aggregazione e
    composizione
                                                                                -membri
■ Nella composizione vale la regola                  Club                                             Persona
    della non condivisione                                             *                *

■ Benché una classe possa essere
    componente di molte altre classi,
    ogni sua istanza può essere
    componente di un solo oggetto
■ Inoltre nella composizione, se il tutto
    viene eliminato, anche i componenti
                                                                {ordered}               1         1
    devono essere eliminati                      Poligono                   Punto                        Cerchio
                                                            1        3..*               -centro
     – Ad esempio, se si cancella un
       poligono, anche tutti i suoi punti
       devono essere eliminati

Approfondimenti diagrammi UML               18                                      Luca Mainetti
Proprietà derivate

■ Sono calcolate a partire da altri
    valori
■ La sintassi prevede di anteporre
    al nome delle proprietà derivate
    il simbolo “/”
                                            PeriodoDiTempo
■ Con un vincolo possiamo
                                            -inizio: Data
    descrivere la semantica di              -fine: Data         {durata = fine – inizio}
    derivazione                             -/durata: Integer

Approfondimenti diagrammi UML          19                         Luca Mainetti
Interfacce e classi astratte
■ Una classe astratta è una classe                                  «interfaccia»
                                                                     Collection
  che non può essere istanziata. Solo                              +equals()
  le sue sottoclassi concrete lo                                   +add()
  possono essere
■ Una classe astratta ha operazioni
  pubbliche astratte, cioè operazioni
  con la sola dichiarazione e senza
  implementazione                                                                              AstractList
                                                   Ordine           «interfaccia»
■ Una classe astratta è indicata con il        -items [*]                List
                                                                                              +equals()
  nome in corsivo o con l’etichetta                                +get()                     +get()
  {abstract}                                                                                  +add()

■ Un’interfaccia è una classe priva di
  implementazione, cioè tutte le sue
  caratteristiche sono astratte
                                                                                                ArrayList
■ Le dipendenze dovrebbero sempre                 Dipendenza       Implementazione
  sussistere tra classe e interfacce e            (richiede        (fornisce
                                                                                              +get()
                                                  l’interfaccia)   l’interfaccia)
  non direttamente tra classi                                                                 +add()

Approfondimenti diagrammi UML             20                                  Luca Mainetti
Interfacce e classi astratte (cont)

■ Le classi possono richiedere
    oppure fornire interfacce                  Ordine   List
■ Una classe richiede                      -items [*]                         ArrayList

    un’interfaccia se ha bisogno di
    una sua istanza per funzionare                               Collection
■ Una classe implementa
    un’interfaccia se è sostituibile ad
    essa
■ In UML2 ci sono due notazioni                Ordine     List
    alternative come mostra                -items [*]                         ArrayList
    l’esempio a fianco

                                                                 Collection

Approfondimenti diagrammi UML         21                           Luca Mainetti
Principi di Progettazione del Software
             a.a. 2016-2017

Diagrammi di sequenza, package, deployment
             Prof. Luca Mainetti
           Università del Salento
Diagramma di sequenza

■ Un diagramma di sequenza rappresenta il comportamento
    di un insieme di oggetti coinvolti in un singolo caso d’uso
■ Sono da utilizzare principalmente per rappresentare
    decisioni già prese sull’implementazione di singoli casi
    d’uso
■ Non spiegano i dettagli degli algoritmi (meglio per questo
    utilizzare i diagrammi di attività)
■ Se invece si è in fase di scelta e si vogliono vagliare
    differenti possibilità d’interazione, è meglio utilizzare le
    schede CRC
■ Prendiamo ad esempio lo scenario di calcolo del prezzo
    totale di un ordine commerciale

Approfondimenti diagrammi UML      23                  Luca Mainetti
Implementazione scenario calcolo prezzo ordine:
                    controllo centralizzato

                                       unOrdine            unaLineaOrdine           unProdotto   unCliente
                        Utente
                            calcolaPrezzo

                                                  getQuantita

                                                  getProdotto

                                                  unProdotto

                                                          getDettagliPrezzo

                                                        calcolaPrezzoBase

                                                        calcolaSconti

                                                                        getInfoSconto

Approfondimenti diagrammi UML                                   24                                           Luca Mainetti
Implementazione scenario calcolo prezzo ordine:
                     controllo distribuito

                                       unOrdine             unaLineaOrdine            unProdotto   unCliente
                        Utente
                            calcolaPrezzo

                                                  calcolaPrezzo

                                                                       getPrezzo(quantita)

                                                                  getValoreSconto(unOrdine)

                                                                         getValoreBase

                                                                         valoreScontato

Approfondimenti diagrammi UML                                     25                                           Luca Mainetti
Creare e distruggere partecipanti

                                           unHandler

                                interrogaDatabase

                                                       new
                                                                    unaQuery

                                                                               new
                                                                                            unComandoDB

                                                                                esegui

                                                                                risultati

                                                                                 chiudi

                                                        risultati

Approfondimenti diagrammi UML                                 26                                          Luca Mainetti
Cicli e condizioni

                                               unOrdine            unaLineaOrdine      unProdotto
                                Utente
                                    calcolaPrezzo

                                           loop           getQuantita

  loop
                                                          getProdotto
  alt                                                     unProdotto

  opt                                                              getDettagliPrezzo

                                                                                                     Frame d’interazione

                                                                calcolaPrezzoBase

Approfondimenti diagrammi UML                                 27                                    Luca Mainetti
Messaggi sincroni e asincroni

                                unOggetto                         unAltroOggetto

                                            Messaggio sincrono

                                            Messaggio asincrono

Approfondimenti diagrammi UML                    28                                Luca Mainetti
Diagramma di comunicazione
■   E’ un particolare tipo di diagramma
    d’interazione che mette in enfasi lo
    scambio di dati tra gli oggetti
    partecipanti
                                                                                           1: calcolaPrezzo
                                                   1.4: calcolaPrezzoBase
■   In UML 1 era chiamato diagramma di             1.5: calcolaSconti
                                                                                                   1.5.1: getInfoSconti
    collaborazione                                                                   unOrdine                                 unCliente

■   E’ equivalente a un diagramma di
    sequenza
■   L’ordine temporale viene specificato
                                                                                                         1.3: getDettagliPrezzo
    dalla numerazione dei messaggi                                1.1: getQuantita
                                                                  1.2: getProdotto
■   E’ più comodo del diagramma di
    sequenza durante le riunioni informali
    (da disegnare alla lavagna)
■   Il diagramma di comunicazione a lato è
                                                                               unaLineaOrdine                                unProdotto
    equivalente al diagramma di sequenza
    presentato precedentemente per la
    specifica dello scenario di calcolo del
    prezzo di un ordine, con controllo
    centralizzato

Approfondimenti diagrammi UML                 29                                                     Luca Mainetti
Diagramma di package

■ Un package è un contenitore di
    elementi UML
                                                          util
■ Tipicamente usiamo i package per
    illustrare sottosistemi
■ In tal senso un package contiene             util

    sotto-package e classi
                                                         Data
■ Un package definisce un
    namespace e rappresenta i
    package Java o i namespace C++ e           java

    C#                                            util

■ Una classe ha un solo package di                       Data

    appartenenza e deve avere un
    nome univoco in tale package
■ Un package è denotato con un box           java::util::Data

    con linguetta

Approfondimenti diagrammi UML        30                          Luca Mainetti
Diagramma di package (cont.)

■ Le classi di un package possono essere pubbliche o private
■ Una classe pubblica fa parte dell’interfaccia del package
■ Può essere usata dalle classi al di fuori del package
■ Come si fa a stabilire quali classi devono appartenere al
    medesimo package?
     – Classi coese
     – Classi che condividono le medesime cause di cambiamento
     – Classi che dovrebbero essere riusate insieme

Approfondimenti diagrammi UML     31                   Luca Mainetti
Package e dipendenze

■ Soprattutto se il sistema è
    complesso, è molto utile un           Presentazione
                                          conti correnti
                                                                            Presentazione
                                                                                fondi

    diagramma dei package che
    documenta i package del
    sistema e le dipendenze tra di                         Interfaccia

    essi                                                     utente

■ Tali dipendenze sono desunte
  dalle dipendenze tra le                 Dominio conti
                                            correnti
                                                                            Dominio fondi

  corrispettive classi
■ Un package con tante
  dipendenze entranti deve
  necessariamente avere                    Mapper dati
                                          conti correnti
                                                                             Mapper dati
                                                                               fondi

  un’interfaccia stabile
■ Le dipendenze non sono
  transitive (fortunatamente)                              Database

Approfondimenti diagrammi UML        32                               Luca Mainetti
Implementare package

■ Può essere utile definire
    interfaccia e implementazione di
    una classe in package separati
                                                           Applicazione

■ Nell’esempio accanto la
    realizzazione indica che
    Gateway del database definisce
    un’interfaccia implementata dagli                      Gateway del
                                                            database
    altri gateway

                                                                             Gateway
                                         Gateway Oracle   Gateway MySQL
                                                                            SQLServer

Approfondimenti diagrammi UML       33                               Luca Mainetti
Diagramma di deployment

■ I diagrammi di deployment
  specificano il rilascio del sistema
  a livello fisico                        Client con                   Client dedicato
                                           browser                     {OS = Windows}

■ Il sistema è fatto di nodi, cioè di
  elementi che possono eseguire
                                                  http                      DCOM
  software
■ Un dispositivo hardware (ad                               Web server
                                                           {OS = Linux}
  esempio un PC) è un nodo                             {web server = Apache}

                                                          Application.war
■ Un ambiente software (ad
  esempio un sistema operativo) è                                  Java RMI

  un nodo
■ I nodi contengono artefatti e                          Application server
                                                            {OS = Linux}
                                                       {EJB container= JBoss}
  componenti (file eseguibili, file di                    {DBMS = Oracle}

  dati, configurazioni, documenti
  HTML, XML, ecc.)

Approfondimenti diagrammi UML        34                              Luca Mainetti
Puoi anche leggere