Fondamenti di Informatica II a.a. 2020-2021 - Dalla programmazione procedurale alla programmazione orientata agli oggetti Prof. Luca Mainetti ...

Pagina creata da Giacomo Antonelli
 
CONTINUA A LEGGERE
Fondamenti di Informatica II
       a.a. 2020-2021

Dalla programmazione procedurale alla
programmazione 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

Programmazione procedurale e OO        2               Luca Mainetti
Programmazione procedurale vs.
            programmazione orientata agli oggetti

Programmazione procedurale e OO   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

Programmazione procedurale e OO         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; }

Programmazione procedurale e OO       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;}

Programmazione procedurale e OO           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 ;
           }
}

Programmazione procedurale e OO                    7                                Luca Mainetti
Dominio del problema e dominio della soluzione

! I linguaggi imperativi definiscono un “dominio della
    soluzione” che “astrae” la macchina sottostante
     – Es.
          1. read i
          2. print i
          3. goto 1
! Il programmatore deve creare un mapping fra “dominio
    del problema” e “dominio della soluzione”
     – Tale mapping è spesso innaturale e di difficile comprensione

Programmazione procedurale e OO    8                       Luca Mainetti
Paradigma Object Oriented

! Per risolvere i problemi presentati dall’approccio
    procedurale, i programmatori hanno fatto sempre più uso di
    tecniche mirate a proteggere dati globali o funzioni
    nascondendone il codice.
! Il paradigma Object Oriented accentra l’attenzione verso i
    dati.
     – L’applicazione viene suddivisa in un insieme di oggetti in grado di
       interagire tra di loro e codificati in modo tale che la macchina sia in
       grado di comprenderli.
     – Un linguaggio OO semplifica il meccanismo di creazione degli
       oggetti.
     – Il paradigma OO si basa sulla tecnica di incapsulare e
       raggruppare parti di un programma

Programmazione procedurale e OO       9                        Luca Mainetti
Cos’è un Oggetto?

     ! Definizione da vocabolario:

                           “Un oggetto è un’entità che si
                           possa immaginare dotata di
                           determinate caratteristiche
                           e funzionalità”.

     ! Il confinamento di informazioni e funzionalità in
         oggetti permette livelli maggiori di astrazione e
         semplifica la gestione di sistemi complessi.

Programmazione procedurale e OO         10                  Luca Mainetti
Gli oggetti come modello naturale

     ! Gli oggetti nel software possono rappresentare entità
         del mondo reale
          – Il primo uso di linguaggi a oggetti è stato fatto per effettuare
            simulazioni

                          Interazioni tra diversi componenti

                                       =
                          scambio di messaggi

Programmazione procedurale e OO         11                      Luca Mainetti
Linguaggi orientati agli oggetti

! Forniscono astrazioni che consentono di rappresentare
    direttamente nel dominio della soluzione gli elementi
    del dominio del problema
     – Oggetti
     – Classi
     – Messaggi

        • Il programmatore inizia analizzando tutti i singoli aspetti concettuali che
        compongono un programma. Questi concetti sono chiamati oggetti con nomi legati a
        ciò che rappresentano.
        • Gli oggetti sono costituiti da attributi (dati) e funzionalità (metodi).
        • L’analisi dovrà includere le modalità di interazione tra gli oggetti e proprio grazie a
        queste interazioni sarà possibile riunire gli oggetti per formare un’applicazione.
                   • A differenza di procedure e funzioni, gli oggetti sono auto-documentanti
                   e il funzionamento interno delle funzionalità di un oggetto è
                   completamente nascosto al programmatore.

Programmazione procedurale e OO               12                              Luca Mainetti
Classi di oggetti

! Pensiamo ad un libro come appartenente ad una classe di oggetti
  aventi caratteristiche comuni: numeri di pagine, testo inserito in ogni
  pagina, note inserite a fondo pagina (attributi).
! Le azioni che tipicamente si compiono quando si utilizza un libro sono:
  voltare pagina, leggere il testo, guardare le figure, ecc.( metodi).
! È interessante notare che si utilizza il termine libro per generalizzare un
    concetto relativo a qualcosa che contiene pagine da sfogliare, da
    leggere o da strappare ossia ci si riferisce ad un insieme di oggetti con
    attributi comuni, ma comunque composto da entità aventi ognuna
    caratteristiche proprie che rendono ognuna differente rispetto all’altra.
! La classe è una categoria di oggetti che fornisce la descrizione
  generale del concetto di libro.
! L’oggetto è una istanza della classe ( ogni nuovo libro) avente
  caratteristiche proprie.

Programmazione procedurale e OO         13                    Luca Mainetti
Un modello a oggetti

           ! L’idea informale:
                rappresentare le entità della programmazione
                come aggregazioni di variabili e metodi
                                                   Esempio:        ContoCorrente

                             comportamento                         saldoAttuale
                                                              deposita
                                                                       codice       ritira
                                                                       titolare
                                  struttura                             saldo
                                                                     interesse
                                                                         fido
                variabili                                                  modificaFido
                                                                 modificaInteresse
                  metodi

Programmazione procedurale e OO               14                                       Luca Mainetti
Rappresentazione di un oggetto

                                        Mes
                                            sag
                                               gio
                                        Met
                                           odo

                                                     Me
                                                       ss
                                                        Met

                                                         ag
                                                           odo

                                                            gi
                                  Attributo

                                                              o
                                  Attributo

                                                     M

                                                     Mes
                                                      e
                                  Attributo

                                                       to
                                                        s
                                                         do

                                                          aggio
Programmazione procedurale e OO   15                              Luca Mainetti
Messaggi

! Gli oggetti sono gli elementi attivi di un programma
     – Come fanno gli oggetti a compiere le azioni desiderate ?
! Gli oggetti sono attivati dalla ricezioni di un messaggio
! Una classe determina i messaggi a cui un oggetto può
    rispondere
     – metodi
! I messaggi sono inviati da altri oggetti

Programmazione procedurale e OO     16                     Luca Mainetti
Scambio di messaggi

           ! Il flusso dell’esecuzione viene visto come
               un flusso di messaggi

                                                                            Esempio:
              Oggetto A                                          Ciclista

                          ricevente.nomeMetodo(parametri)                   bici.cambiaRapporto(2)
                                                                  bici
                                             Oggetto B                                        Bicicletta
                          messaggio

           ! Componenti di un messaggio:
                 – un riferimento al ricevente;
                 – il nome del metodo;
                 – i parametri.

Programmazione procedurale e OO                             17                        Luca Mainetti
Classi
       ! Descrivere gli oggetti uno ad uno è poco vantaggioso.
           Infatti:
            – ogni oggetto richiederebbe una descrizione specifica;
            – la grande varietà ostacolerebbe la comunicazione.

       ! Al contrario, una classe è uno schema generale
           per la creazione di oggetti simili:
            – la struttura degli oggetti è descritta come schema;
            – il comportamento degli oggetti è definito in modo effettivo.
                                               comportamento

                                                 struttura
               dichiarazione delle variabili
                          metodi effettivi

Programmazione procedurale e OO                     18               Luca Mainetti
Classi e istanze: ContoCorrente

  class ContoCorrente {
    String codice;                     ContoCorrente
    String titolare;
    float saldo;                                 ritira
    ...
    void deposita(float somma) {             codice           istanza di
      saldo += somma;                                                                N58AB
                                             titolare
    }                                                                                 Gino
                                              saldo
                                                                                     1.350
      void preleva(float somma) {      deposita
        saldo -= somma;
                                                          istanza di
      }
  }
                                                                                                    c1.deposita(31)

                                            istanza di
                                                                AA54Z
                                                                 Pino
                                                                7.823

                                    N58AB
                                     Lino
                                    2.500                       c2.preleva(275)

                                                                                                Operatore
                                                                       c3.deposita(50)

Programmazione procedurale e OO                   19                                     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

Programmazione procedurale e OO        20                        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”

Programmazione procedurale e OO   21                 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

Programmazione procedurale e OO      22                       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

Programmazione procedurale e OO       23                       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

Programmazione procedurale e OO       24                     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

Programmazione procedurale e OO       25                      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

Programmazione procedurale e OO          26                        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

Programmazione procedurale e OO       27              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
Programmazione procedurale e OO       28                        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)

Programmazione procedurale e OO      29                      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

Programmazione procedurale e OO                30                   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

Programmazione procedurale e OO         31                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

Programmazione procedurale e OO            32                            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

Programmazione procedurale e OO     33               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

Programmazione procedurale e OO     34                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

Programmazione procedurale e OO     35                      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

Programmazione procedurale e OO        36                   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

Programmazione procedurale e OO          37                 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

Programmazione procedurale e OO       38                        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

Programmazione procedurale e OO           39         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

Programmazione procedurale e OO      40                        Luca Mainetti
L’architettura software del corso di
               Principi di Ingegneria del Software

Programmazione procedurale e OO   41           Luca Mainetti
Puoi anche leggere