Principi di Progettazione del Software a.a. 2018-2019 - La progettazione orientata agli oggetti Prof. Luca Mainetti Università del Salento

Pagina creata da Manuel Maggio
 
CONTINUA A LEGGERE
Principi di Progettazione del Software
             a.a. 2018-2019

   La progettazione orientata agli oggetti
            Prof. Luca Mainetti
           Università del Salento
Obiettivi della lezione

■ Apprendere alcune tecniche per scomporre un sistema in
     moduli (oggetti)
■ Presentare le principali tipologie di relazioni che esistono tra
     i moduli (oggetti)
■ Vedere alcuni principi guida di modularizzazione
     (principalmente l’information hiding)
■ Riflettere su alcuni pattern architetturali e su alcuni stili di
     progettare le architetture software

La progettazione orientata agli oggetti     2               Luca Mainetti
Programmazione procedurale vs.
              programmazione orientata agli oggetti

La progettazione orientata agli oggetti   3   Luca Mainetti
Programmazione procedurale vs.
      programmazione orientata agli oggetti (cont.)

                Procedurale                   Orientata agli oggetti
                Procedura                     Metodo
                Record                        Oggetto
                Modulo (es. funzione C)       Classe
                Chiamata di procedura         Messaggio

La progettazione orientata agli oggetti   4                            Luca Mainetti
C vs. Java: un semplice esempio C

#include 
void SayHello(char *); // prototipo
int main(int argc, char *argv[])
{
    sayHello("World");
    return 0; }

void sayHello(char *name)
{
    printf("Hello, %s\n", name);
    return 0; }

La progettazione orientata agli oggetti   5     Luca Mainetti
C vs. Java: C suddiviso in moduli

SayHello.h                                      Main.c
void SayHello(char *); /* prototipo */          #include 
                                                #include "sayhello.h"
                                                int main(int argc, char *argv[])
SayHello.c
                                                {
#include 
                                                           sayHello ("World");
#include "sayhello.h”
// se si premettesse static, SayHelloTo                    return 0; }

// non sarebbe invocabile da main.c
void sayHello (char *name)
{
             printf("Hello, %s\n", name);
             return 0;}

La progettazione orientata agli oggetti     6                              Luca Mainetti
C vs. Java: l’equivalente codice Java

Greeter.java                                              GreaterMain.java
public class Greeter                                      public class GreeterMain
{                                                         {
             private String name;                                   public static void main(String[] args)
             public Greeter(String aName)                           {
             {                                                                 Greeter worldGreeter = new
                          name = aName;                   Greeter(“World”);

             }                                                                 String greeting =
                                                          worldGreeter.sayHello();
                                                                    System.out.println(greeting);
             public String sayHello()
                                                                    }
{
                                                          }
                          return “Hello, ” + name ;
             }
}

La progettazione orientata agli oggetti               7                                Luca Mainetti
Attività di progettazione

■ La progettazione
      – fornisce la struttura agli artefatti
      – permette di decomporre un sistema in parti
      – di assegnare le relative responsabilità
      – assicurare che le parti concorrano ai requisiti globali
■ Il risultato della progettazione è il modello dei sistema
■ L’architettura è la parte centrale del modello
■ Definisce un modo generale di procedere all’organizzazione
     di un modello in parti
■ La progettazione è il ponte tra requisiti e implementazione

La progettazione orientata agli oggetti   8                       Luca Mainetti
Attività di progettazione (cont.)

■ La scomposizione di un sistema in moduli è la parte
     principale dell’attività di progettazione
■ Il documento di progettazione pone enfasi
     sull’organizzazione del sistema in moduli e sulle relazioni
     che esistono tra i moduli
■ Questo è ciò che si intende con “architettura software”: un
     insieme di moduli e di relazioni tra moduli che concorrono a
     realizzare un sistema comune (in termini di requisiti)
■ Saper progettare l’architettura del software è quindi
     fondamentale
■ Non vanno però persi di vista i requisiti: l’architettura
     “realizza i requisiti”

La progettazione orientata agli oggetti   9           Luca Mainetti
Architettura software

■ Mostra la struttura generale del sistema
■ I moduli che la compongono sono generalmente troppo
     “grandi” per poter essere mappati direttamente in software,
     ma sono già una linea guida importante per procedere nel
     raffinamento
■ La descrizione dell’architettura software include
   – i componenti principali del sistema
      – le relazioni tra questi componenti
      – il motivo e le ragioni per cui si è scelta tale scomposizione
      – vincoli che devono essere rispettati nella progettazione dei
        componenti

La progettazione orientata agli oggetti   10                   Luca Mainetti
Architettura software (cont.)

■ Vi sono due obiettivi importanti
■ Progettazione per il cambiamento (Parnas)
      – il design si concentra sulle necessità espresse nei requisiti
      – una parte dell’effort è comunque dedicata ad anticipare possibili
        cambiamenti
■ Progettazione per famiglie di applicazioni (Parnas)
      – pensare che il sistema che si sta progettando non è una sola
        istanza, ma fa parte di una famiglia di programmi
      – gli esemplari della famiglia possono differenziarsi per versioni
        dovute a differenti ambienti di rilascio (device/canali) o a contesti di
        utilizzo

La progettazione orientata agli oggetti   11                    Luca Mainetti
Progettazione per il cambiamento

■ E’ fondamentale saper progettare per il cambiamento
■ Il 60% del costo del software è per la manutenzione
      – correttiva
      – adattiva
      – perfettiva
■ Chi non progetta per il cambiamento
      – corre il rischio di spendere più effort per la manutenzione adattiva e
        perfettiva
      – compromette progressivamente la struttura logica del software per
        soddisfare le richieste di cambiamento quando queste emergono
      – rischia di peggiorare l’affidabilità del sistema

La progettazione orientata agli oggetti   12                  Luca Mainetti
Alcune cause di cambiamento

■ Cambiamenti riguardanti gli algoritmi
   – ad esempio, sostituire un algoritmo di ordinamento con uno più
          efficiente
      – a proposito degli algoritmi, esiste un pattern di progettazione
        dedicato dal nome “strategy” che risolve il problema
        dell’incapsulamento di un algoritmo al fine di facilitarne la
        sostituibilità
■ Cambiamenti riguardanti la rappresentazione dei dati
   – ad esempio, passare da un albero binario ad un albero tramato
   – il 17% dei costi di manutenzione sono attribuibili a cambiamenti nella
        struttura dei dati (Lientz e Swanson, 1980)
      – il cambiamento nella struttura dati non ha solamente effetto
        sull’efficienza. Pensate, ad esempio, a strutture che permettono di
        aggiungere facilmente e velocemente informazioni (campi) in un file

La progettazione orientata agli oggetti   13                   Luca Mainetti
Alcune cause di cambiamento (cont.)

■ Cambiamenti riguardanti la macchina astratta sottostante
   – nuove versioni di sistema operativo
   – nuove versioni (ottimizzate) dei compilatori
   – nuove versioni di DBMS
   – ecc.
■ Cambiamenti dovuti a periferiche e device
      – molto importante ora che nuove periferiche d’interazione si stanno
        affermando
■ Cambiamenti dovuti al contesto
      – ad esempio, nuovo regime fiscale, passaggio all’Euro per un sistema che si
        occupa di transazioni finanziarie
■ Cambiamenti dovuti al processo di sviluppo
      – trasformazioni di prototipi in prodotti in un processo incrementale

La progettazione orientata agli oggetti   14                        Luca Mainetti
Moduli e architettura

■ Un modulo è uno dei sottosistemi che compongono
     un’applicazione software
■ La progettazione di un’applicazione riguarda quindi la
     progettazione dei moduli e delle mutue interrelazioni
■ Un modulo è una porzione di software dotata di una sua
     memoria persistente. E’ quindi qualcosa di più di una
     semplice routine la cui memoria perde di significato quando
     lo stack viene deallocato
■ Un modulo è una porzione di software che contiene e
     fornisce risorse e servizi computazionali

La progettazione orientata agli oggetti    15              Luca Mainetti
Moduli e architettura (cont.)

■ I principali criteri per una buona modularizzazione sono la
     valutazione del grado di coesione e del disaccoppiamento
■ Coesione
   – è il grado di unità e di legami interni tra gli elementi di un modulo
   – un modulo coeso è fatto da elementi omogenei
   – un modulo coeso è facilmente comprensibile, è facilmente
          realizzabile, rende facilmente modificabile l’intero sistema poiché gli
          interventi sono localizzati
■ Disaccoppiamento
   – è il grado di indipendenza tra moduli distinti
   – quanto più i moduli sono disaccoppiati, tanto più sono facili da
          comprendere e da realizzare indipendentemente poiché la
          comprensione di un modulo non richiede la comprensione degli altri
      – moduli disaccoppiati hanno pochi e semplici legami
La progettazione orientata agli oggetti   16                     Luca Mainetti
Moduli e architettura (cont.)

■ L’insieme delle interrelazioni tra i moduli viene detta
     architettura del sistema
■ In realtà, quando si definisce un’architettura software, si
     definiscono contemporaneamente moduli ed interrelazioni.
     L’identificazione dei moduli non può essere ovviamente
     disgiunta dall’individuazione delle mutue dipendenze
■ L’architettura di un sistema viene generalmente
     rappresentata tramite grafi diretti (la direzione indica il verso
     delle dipendenze)
      – G = 
      – N è l’insieme dei nodi
      – A ⊆ N x N è l’insieme degli archi (l’ordine è importante nella
        specifica delle dipendenze)

La progettazione orientata agli oggetti   17                  Luca Mainetti
Moduli e architettura (cont.)

■ Siamo generalmente interessati a grafi aciclici
   – una sequenza ,, …, di archi di un grafo è
           un ciclo se n1=nk, cioè se si ha un cammino chiuso
       – un grafo diretto aciclico viene detto gerarchia. In una gerarchia i
         nodi possono essere classificati per livelli
       – spesso siamo anche interessati a particolari grafi aciclici. In un
         albero esiste uno ed un solo cammino diretto che collega la radice
         con ciascuno degli altri nodi
                                A                                       A

                     B                    C        D            B                C          D

             E           F                     G            E       F                  G

                                              Grafo                                  Albero
                                H                                       H

La progettazione orientata agli oggetti                18                   Luca Mainetti
La relazione USA

■ La relazione USA è una di quelle più spesso ricorrenti tra i
     moduli
■ Tale relazione evidenzia quali sono i servizi che un modulo
     mette a disposizione agli altri, e quali sono i servizi che ogni
     singolo modulo richiede agli altri
■ E’ quindi la struttura logica più importante di un’architettura
     di sistema
■ ni USA nj se perché il modulo ni risulti corretto rispetto alle
     specifiche è necessaria anche la corretta esecuzione di nj
■ In altri termini ni risulta cliente dei servizi di nj

La progettazione orientata agli oggetti         19           Luca Mainetti
La relazione USA (cont.)

■ La relazione USA sta tra due estremi
   – USA = M x M
            • tutti i moduli del sistema sono in relazione USA
            • il grado di disaccoppiamento del sistema è troppo basso
      – USA = ∅
            • nessun modulo usa servizi di nessun altro
            • il sistema è fatto di sottosistemi isolati in cui è presumibile che siano
              replicate varie funzionalità, quindi il livello di coesione è scarso
■ Si deve trovare il giusto equilibrio tra i due estremi
   – un modulo deve fare uso di un numero limitato di risorse di altri
        moduli (il modulo risulta più facilmente comprensibile da solo),
        quindi il numero di archi uscenti deve essere basso
      – un modulo deve ricevere invece parecchie richieste dall’esterno (i
        servizi sono stati fattorizzati), quindi il numero di archi entranti deve
        essere elevato
La progettazione orientata agli oggetti     20                           Luca Mainetti
La relazione USA (cont.)

■ La relazione USA non si esaurisce con la sola chiamata di
     metodo o di procedura
■ Vanno considerate situazioni in cui i moduli si scambino
     messaggi oppure condividano strutture dati
■ Questa osservazione è molto importante vista la costante
     evoluzione tecnologica e dei linguaggi di programmazione
■ I moduli che si scambiano messaggi ed i moduli che usano
     strutture condivise sono in relazione USA

La progettazione orientata agli oggetti   21              Luca Mainetti
La relazione USA (cont.)

■ Nella progettazione di sistemi concreti, è utile che la
     relazione USA sia aciclica. In altri termini è utile che
     l’architettura del sistema sia gerarchica
■ In una gerarchia si dice che mi è ad un livello di astrazione
     maggiore di mj sei il suo livello rispetto alla gerarchia USA è
     minore del livello di mj
■ Un sistema gerarchico può essere analizzato dal livello più
     alto di astrazione: per comprendere un modulo è sufficiente
     avere conoscenza dei moduli utilizzati
■ Un sistema gerarchico può essere realizzato, integrato e
     verificato per parti
■ Si evitano quindi i casi pericolosi in cui nulla funziona finché
     tutto funziona

La progettazione orientata agli oggetti   22              Luca Mainetti
La relazione COMPONENTE_DI

■ Una relazione ortogonale a USA è COMPONENTE_DI
■ In questo caso si rappresenta il raffinamento progressivo di
     un modulo in sottomoduli
■ COMPONENTE_DI ⊆ M x M
      – tale relazione deve dare luogo necessariamente ad una gerarchia
      – la gerarchia non deve essere necessariamente un albero, ma in
        generale può contenere collegamenti diretti anche tra livelli non
        contigui
■ Tra tutti i moduli appartenenti ad una relazione
     COMPONENTE_DI solamente quelli terminali esistono
     effettivamente nel sistema. I moduli intermedi servono per il
     raffinamento del sistema e per la sua documentazione

La progettazione orientata agli oggetti   23                 Luca Mainetti
La relazione COMPONENTE_DI (cont.)

■ Una volta che un modulo che appartiene alla relazione USA
     viene scomposto in sottomoduli, devono essere anche
     ridefiniti gli archi USA sui sottomoduli stessi

                        A                           A         a1        a2       a3

           B                      C
                                          a1        a2   a3         F        B        C

   E           F        D

        I: specifica di USA               II: specifica di    III: ridefinizione di USA
                                          COMPONENTE_DI       per i moduli coinvolti

La progettazione orientata agli oggetti        24                   Luca Mainetti
Information hiding

■ Una volta definita l’architettura di sistema, con le relazioni
  USA e COMPONENTE_DI, prima di procedere
  all’implementazione è necessario entrare maggiormente nel
  dettaglio della progettazione delle effettive relazioni che
  legano i moduli
■ In sostanza devono essere definite le interfacce dei moduli,
  cioè l’insieme dei servizi messi a disposizione
■ Il contenuto del modulo (anche detto realizzazione o
  implementazione) rimane invisibile dall’esterno. Deve poter
  essere deciso localmente e non deve dipendere dagli altri
  moduli
■ Questo in sintesi è il concetto di information hiding
      – interfaccia (risorse esportate, risorse importate)
      – realizzazione

La progettazione orientata agli oggetti      25              Luca Mainetti
Information hiding (cont.)

■ Sono principalmente le scelte di progetto locali (interne al
     modulo) che devono essere tenute nascoste, così che
     possa essere garantita la modificabilità
■ Ad esempio, tipiche scelte locali possono essere
      – gli algoritmi utilizzati (non è utile che un modulo cliente conosca i
        dettagli degli algoritmi utilizzati da un modulo servente per fornire
        servizi)
      – le strutture dati locali (differente è ovviamente il discorso per le
        strutture dati condivise)
      – le politiche di assegnamento delle risorse
■ L’elenco sopra riportato è ampiamente incompleto e
     puramente indicativo

La progettazione orientata agli oggetti   26                     Luca Mainetti
I moduli come astrazione sul controllo

■ Nei linguaggi di programmazione tradizionali i moduli
     corrispondono alle subroutine
■ In questo caso il modulo è soprattutto un’astrazione del
     controllo: infatti le subroutine non nascondono totalmente i
     dati su cui operano (pensate a variabili globali e quindi agli
     effetti collaterali), altrimenti al loro termine le operazioni non
     avrebbero effetto, ma nascondono soprattutto il flusso di
     controllo delle istruzioni, cioè gli algoritmi
■ Le subroutine permettono di realizzare una particolare
     classe di moduli detta librerie: procedure spesso utilizzate,
     molto efficienti, affidabili e facilmente comprensibili

La progettazione orientata agli oggetti   27            Luca Mainetti
I moduli come astrazione sui dati

■ Però la information hiding deve essere estesa anche ai dati
■ Al livello più basso si ha il raggruppamento di dati in modo
     da centralizzarne l’accesso
      – si pensi ad un modulo che contiene i dati di configurazione di un
        sistema software
■ Poi l’astrazione può procedere in due direzioni ortogonali in
     termini di riusabilità, flessibilità, genericità
                                               Tipizzazione

                                                       Tipi di dati
                                          Oggetti
                                                         astratti
                            Genericità
                                                       Tipi di dati
                                          Oggetti
                                                         astratti
                                          generici
                                                        generici

La progettazione orientata agli oggetti         28                    Luca Mainetti
Oggetti

■ Un oggetto è un modo di incapsulare dati (attributi) in un
     modulo, regolandone l’accesso tramite opportune
     procedure (metodi)
■ Un oggetto deve essere caratterizzato agli effetti esterni
     soltanto dalla sua interfaccia
■ Però una visione puramente funzionale non è sufficiente. Il
     comportamento di un oggetto è anche dato dal suo stato.
     Oggetti con la medesima interfaccia, ma che si trovano in
     stati differenti possono avere comportamenti differenti
■ La dipendenza dei risultati delle elaborazioni dallo stato
     differenzia gli oggetti dalle librerie; le librerie forniscono
     solamente funzionalità, non contengono dati

La progettazione orientata agli oggetti    29            Luca Mainetti
Tipi di dati astratti

■ Un tipo di dato astratto è in estrema sintesi il concetto di
     tipo di variabile applicato ad un oggetto
■ Una classe è un modo di rappresentare un tipo di dato
     astratto
■ Una classe è un’astrazione di tipizzazione di un oggetto
■ Una classe è un tipo di oggetto
■ Un tipo di dato astratto è quindi un modulo che incapsula
     sia la definizione di un tipo, la cui struttura risulta invisibile
     all’esterno, sia l’insieme delle operazioni che permettono di
     manipolare gli oggetti (istanze) di quel tipo

La progettazione orientata agli oggetti       30              Luca Mainetti
Oggetti generici

■ Un oggetto generico non incapsula direttamente dei dati e
     le relative procedure d’accesso, ma piuttosto fornisce uno
     schema (template) di incapsulamento
■ E’ un’astrazione utile in tutti in quei casi in cui la
     manipolazione di un oggetto “composto” non dipende dalla
     natura dei suoi “componenti”
■ Pensiamo ad una tabella ed alle procedure di
     manipolazione: sono indipendenti dalla natura degli
     elementi della tabella
■ Un oggetto generico è quindi parametrico rispetto al suo
     tipo e per poter essere usato deve essere prima istanziato

La progettazione orientata agli oggetti         31           Luca Mainetti
Oggetti generici (cont.)

■ Qui segue un esempio di istanziazione in pseudo-codice
  – generic module TabellaGenerica(TipoElemento);
  – module TabellaDiInteri is TabellaGenerica(Integer);
■ Si può verificare che per manipolare correttamente i dati un
     oggetto generico debba comunque far ricorso ad
     informazioni sull’effettivo tipo rispetto al quale è parametrico
■ Un oggetto generico può quindi esserlo anche rispetto alle
     funzionalità
      – generic module TabellaGenerica(TipoElemento)
         with Ordinamento(Elemento: TipoElemento);
      – modulo TabellaDiInteri is TabellaGenerica(Integer)
         with Crescente(Integer);
      – modulo TabellaDiPersone is TabellaGenerica(Persona)
         with Crescente(Persona);
La progettazione orientata agli oggetti   32               Luca Mainetti
Architetture standard

■ Si possono riscontrare alcune
     architetture ricorrenti
      – pipeline                                                          pipeline

      – blackboard: un modulo fa
        comunicare tutti gli altri
      – basate su eventi: soddisfano il
        paradigma “pubblicazione-
        sottoscrizione”; alcuni moduli                               blackboard
        pubblicano (generano) eventi,
        altri si registrano (si
        sottoscrivono)
      – specifiche di dominio: tengono
        conto delle caratteristiche di
                                                                           eventi
        determinati domini applicativi

La progettazione orientata agli oggetti   33              Luca Mainetti
Architetture standard (cont.)

■ Un esempio molto noto di un’architettura specifica di dominio è
     “model-view-controller”
■ Si presta a risolvere situazioni in cui è rilevante l’interazione con l’utente

La progettazione orientata agli oggetti   34                   Luca Mainetti
Puoi anche leggere