OOP - Object Oriented Programming
OOP - Object Oriented Programming Agenda OVERVIEW CRISI DELL’INFORMATICA NUOVO PARADIGMA LE NUOVE RISORSE ELEMENTI
OOP – OVERVIEW Nasce alla fine degli anni ottanta inizio degli anni novanta e segna la fine della crisi dell’informatica E’ una delle innovazioni più rilevanti degli ultimi anni nella programmazione degli elaboratori. Modifica radicalmente il punto di vista dal quale si affronta il progetto di un’applicazione.
OOP - Object Oriented Programming Agenda OVERVIEW CRISI DELL’INFORMATICA NUOVO PARADIGMA LE NUOVE RISORSE ELEMENTI
OOP – CRISI DELL’INFORMATICA La «crisi dell’informatica», fine anni ottanta inizi anni novanta, è la conseguenza dell’insoddisfazione per l’inadeguatezza degli strumenti software messi a disposizione degli sviluppatori di fronte alla repentina evoluzione dei sistemi hardware. In sostanza la crisi informatica è imputabile ad una profonda difficoltà di gestione del software applicativo che ha portato, in quegli anni, ad una ridicolizzazione dei progettisti e degli operatori del settore. La crisi informatica si identifica pertanto con la «crisi del software applicativo»
OOP – CRISI DELL’INFORMATICA Crescita Hardware Riduzione costi delle macchine e dei sistemi operativi Crescita Hardware Riduzione costi delle macchine e dei sistemi operativi Costi di sviluppo e manutenzione del software applicativo sproporzionati e preponderanti nella componente sia correttiva (eliminazione di errori), sia implementativa (risposta a nuove esigenze). Costi di sviluppo e manutenzione del software applicativo sproporzionati e preponderanti nella componente sia correttiva (eliminazione di errori), sia implementativa (risposta a nuove esigenze). Crisi del Software Applicativo Crisi del Software Applicativo Crisi Informatica Crisi Informatica
OOP – CRISI DELL’INFORMATICA Focus sulle cause della crisi software Crisi Dimensionale Dovuta ad un aumento della richiesta di informatizzazione, quindi crescita dei sistemi informatici e diffusione sempre maggiore dei computer. Tutto ciò implica aumento elevato delle dimensioni fisiche e difficoltà di gestione. Come conseguenza dell’aumento dimensionale si ha l’aumento dei costi di gestione per la manutenzione del software applicativo. Nei sistemi di grandi dimensione ricercare gli errori può risultare molto dispendioso in termini di tempo e di risorse coinvolte. Crisi Gestionale L’incremento dimensionale mette in evidenza l’inadeguatezza delle strutture software utilizzate. Funzioni / procedure ripetute e non ottimizzate, mancanza di parametrizzazione, cicli procedurali infiniti provocano la lentezza nelle esecuzioni e talvolta il loop procedurale. Crisi Qualitativa
OOP – CRISI DELL’INFORMATICA SI PRENDE COSCIENZA CHE LA CRISI DELL’INFORMATICA E’ LEGATA PRINCIPALMENTE ALL’INADEGUATEZZA DEI PROGRAMMI SOFTWARE OOP – CRISI DELL’INFORMATICA CRISI INFORMATICA CRISI SOFTWARE
OOP – CRISI DELL’INFORMATICA QUAL E’ LA SOLUZIONE NUOVA METODOLGIA DI PROGRAMMAZIONE SOFTWARE
OOP - Object Oriented Programming Agenda OVERVIEW CRISI DELL’INFORMATICA NUOVO PARADIGMA LE NUOVE RISORSE ELEMENTI
OOP – NUOVO PARADIGMA La programmazione orientata ad oggetti OOP si impone come nuova metodologia di programmazione. Si abbandonano i vecchi paradigmi (imperativo, funzionale, logico) per dare lo start ad una nuova metodologia: «Paradigma ad Oggetti» il cui scopo principale è quello di Progettare un Sistema e non un singolo programma. I vecchi paradigmi, con le loro strutture dati e di controllo, non si sono dimostrati strumenti efficaci. Il risultato è un sistema software di bassa qualità.
Come deve essere «un sistema software di alta qualità» OOP – NUOVO PARADIGMA Come deve essere «un sistema software di alta qualità»
OOP – NUOVO PARADIGMA Parametri valutativi Specifiche Funzionali; Documentato Specifiche Funzionali; Specifiche Tecniche; Parametrizzato Nessuna istruzione statica; Utilizzo di parametri e variabili; Modulare Componenti (moduli) indipendenti ma integrati tra loro; Ogni modulo del sistema si occupa di gestire funzionalità specifiche; SISTEMA SOFTWARE DI ALTA QUALITA’ Riusabile/ Affidabile Riutilizzabile in altri contesti; Riutilizzato, quindi già testato e collaudato, implica un’affidabilità maggiore; Incrementabile/ Estendibile Incrementabile ed estendibile con un impatto minimo; Indipendente dalla piattaforma Non dipende dalla piattaforma di utilizzo né dal sistema operativo;
OOP - Object Oriented Programming Agenda OVERVIEW CRISI DELL’INFORMATICA NUOVO PARADIGMA LE NUOVE RISORSE ELEMENTI
OOP – LE NUOVE RISORSE Project manager Project Leader Analyst Progettista / Analista funzionali. Sostituisce la figura del programmatore dei vecchi paradigmi di gestione Ha la responsabilità diretta, in termini di costi, risorse, tempi di consegna, qualità, di una specifica area funzionale Ha la responsabilità dell’intero progetto in termini di costi, risorse, tempi di consegna, qualità Project manager Project Leader Analyst
OOP – LE NUOVE RISORSE Competenze funzionali: ha conoscenza dei fondamenti teorici della problematica da gestire; Visione sistemistica del problema: ha una visione d’insieme che gli consente di identificare e gestire gli impatti; Con l’avvento dell’OOP Il programmatore non è più la risorsa che si occupa esclusivamente della codifica dei dati e della scrittura di istruzioni, bensì è un «progettista» che ha la visione d’insieme dell’intero progetto ed a cui sono richieste maggiori competenze. Competenze tecniche: padronanza degli strumenti informatici disponibili; Capacità organizzative: è capace di organizzare, gestire, pianificare; Capacità relazionali: si relaziona al suo interno e con gli utenti di business utilizzatori finali.
OOP - Object Oriented Programming Agenda OVERVIEW CRISI DELL’INFORMATICA NUOVO PARADIGMA LE NUOVE RISORSE ELEMENTI
OOP – ELEMENTI - INTRODUZIONE ASTRAZIONE Il paradigma OOP modella la realtà in modo naturale utilizzando lo strumento più potente a disposizione della mente umana e cioè «l’Astrazione». L’astrazione è il risultato di un processo secondo il quale, assegnato un sistema, si possono tener nascosti alcuni particolari e mettere in evidenza solo quelli essenziali. OGGETTI, METODI, ATTRIBUTI L’astrazione nasce dall’individuazione di similitudini tra oggetti e dalla decisione di concentrarsi solo su questi fenomeni simili e trascurare le loro differenze. Gli oggetti simili hanno comportamenti uguali (Metodi) e caratteristiche specifiche (Attributi) che li differenziano tra loro. CLASSI Gli oggetti simili sono raccolti in «Classi», dove ogni classe è l’origine degli oggetti stessi.
OOP – ELEMENTI – CLASSI/OGGETTI Una «Classe» è l’elemento base della OOP. «La classe è un «insieme astratto», un «modello» di oggetti in cui si definiscono «attributi» e «comportamenti» che consentono di identificare un oggetto fisico come appartenente alla classe; Quando si scrivono programmi in un linguaggio orientato ad oggetti, non si definiscono oggetti ma classi di oggetti; Esenìpio Una «classe» «Albero» si identifica come un insieme «astratto» di alberi (concetto di astrazione) nel quale definire le caratteristiche principali (tipi attributi) comune a tutti gli alberi: ha foglie e radici, cresce, produce clorofilla. La classe albero è una modellizzazione astratta del concetto di albero. Per aggrapparsi ad un albero, tagliarlo, interagire, non ci basta il modello definito con la classe, si ha bisogno fisicamente di un oggetto di tipo albero. Occorre quindi una «istanza» concreta, in altri termini «un oggetto». Si possono definire istanze di alberi diverse (basso, alto, frondoso, etc…) pur comportandosi sempre come albero. Il termine istanza di una classe è sinonimo di oggetto effettivo. Mentre una classe è una rappresentazione generale di un oggetto, un’istanza ne è la rappresentazione concreta. Istanza ed oggetto, sono la stessa cosa, sono due termini diversi di definire lo stesso concetto
OOP – ELEMENTI – CLASSI/OGGETTI Classe Albero (la genetica) Quattro oggetti fisici (istanze di classe) della classe Albero
OOP – ELEMENTI – CLASSI/OGGETTI/ATTRIBUTI/METODI Per implementare una classe in maniera completa si devono definire: Il nome della classe; gli Attributi e cioè le caratteristiche basi della classe; i Comportamenti e cioè le funzionalità della classe. Per ogni attributo si indica il nome ed il tipo dell’attributo (stringa, booleano, numerico, etc…) mentre i valori assunti dall’attributo generalmente sono assegnati al momento della definizione dell’oggetto. Per i comportamenti si identificano i tipi di comportamento e si implementano le funzionalità (metodi) che saranno usate dall’oggetto. .
OOP – ELEMENTI – CLASSI/OGGETTI/ATTRIBUTI/METODI Gli attributi sono: variabili d’istanza qualora i valori siano depositati negli oggetti e cioè i valori assunti dall’attributo sono settati solo al momento dell’istanza dell’oggetto. variabili di classe qualora i valori siano definiti all’interno della classe. In questo caso si dice anche che l’attributo è di tipo «static». Gli oggetti ereditano il valore definito nella classe. Se un oggetto setta il valore in maniera differente, la variazione ha effetto su tutte le istanze della classe.
OOP – ELEMENTI – CLASSI/OGGETTI/ATTRIBUTI/METODI Per un comportamento sono implementati i metodi e cioè le funzioni/procedure che risolvono il comportamento. Per ogni comportamento possono essere definiti più metodi, oggetti diversi della stessa classe possono utilizzare stessi metodi o metodi differenti di uno stesso comportamento.
OOP – ELEMENTI – CLASSI/OGGETTI/ATTRIBUTI/METODI In termini di visibilità del dato, gli attributi ed i metodi sono definiti: «Public» - l’attributo e/o metodo è visibile esternamente alla classe, quindi può essere richiamato dagli oggetti di altre classi. «Private» - l’attributo e/o metodo è proprietario della classe, nessun altro oggetto di altre classi lo possono utilizzare. «Protected»- l’attributo e/o metodo è visibile alla classe ed alle sottoclassi per ereditarietà (concetto che sarà approfondito in seguito). La parte pubblica di una classe è detta Interfaccia.
OOP – ELEMENTI – CLASSI/OGGETTI/ATTRIBUTI/METODI Definita la classe, il passo successivo è quello di istanziare gli oggetti della classe e cioè definire in maniera concreta gli elementi della classe. Per istanziare un oggetto devono essere settate le variabili d’istanza, quindi assegnati i valori agli attributi ed istanziati i metodi per ogni attributo. Per rendere più comprensibile l’argomento riportiamo di seguito degli esempi.
OOP – ELEMENTI – CLASSI/OGGETTI Per ogni attributo di una classe, devono essere sempre definiti i seguenti metodi : Setters – Metodi pubblici setta valore denominati setNomeattributo() utilizzati per valorizzare gli attributi di un oggetto. Ricevono in input il valore da assegnare all’attributo. Getter – Metodi pubblici leggi valore denominati getNomeattributo(), utilizzati dai metodi per leggere i valori degli attributi. Non ricevono in input nulla e ritornano in output il valore (sintassi di esempio coloreSalva = getColore()). Tali metodi, essendo pubblici possono essere utilizzati anche da metodi di altre classi.
OOP – ELEMENTI – CLASSI/OGGETTI/ATTRIBUTI/METODI Per ogni classe, se non espressamente indicato, è definito per default un metodo costruttore che ha lo stesso nome della classe nomeclasse(). Il costruttore non torna in output nessun tipo di variabile ed ha una visibilità pubblic. Serve per istanziare l’oggetto della classe. Se l’oggetto è stato già istanziato non è possibile invocare il costruttore per l0 stesso oggetto.
OOP – ELEMENTI – CLASSI/OGGETTI/ATTRIBUTI/METODI Portiamo come primo esempio la classe «Pulsante». Nella classe pulsante sono definiti gli attributi: etichetta, forma, colore ed i comportamenti: Modalità di attivazione, Aspetto, Effetto prodotto: è attivato da un click singolo oppure doppio, cambia colore quando è attivato, che effetto produce quando è attivato. OOP – ELEMENTI – CLASSI/OGGETTI/ATTRIBUTI/METODI DEFINIZIONE Classe Pulsante Attributi Etichetta di tipo stringa Forma di tipo stringa Colore di tipo stringa Comportamenti Modalità di attivazione: Metodo 1 = azione con click singolo Metodo 2 = azione con doppio click Aspetto durante l’attivazione: Metodo 1 =contorni evidenziati Metodo 2 = = pulsante cambia colore Effetto prodotto dall’attivazione : Metodo1 = salvataggio dei dati inseriti Metodo 2 = Ripulisce i dati inseriti setEtichetta() setForma SetColore getEtichetta() getForma getColore
OOP – ELEMENTI – CLASSI/OGGETTI/ATTRIBUTI/METODI Istanziamo due oggetti della classe pulsante, cioè oggetti fisici di tipo pulsante che assumono le caratteristiche principali definite dalla classe ma hanno aspetto e comportamenti diversi. Istanza 1 della classe Pulsante: «Salva» Istanza 2 della classe Pulsante: «Annulla» Attributi/Valori setEtichetta (Salva) setForma(Rettangolare) setColore(Grigio) Comportamenti/Metodi Modalità di attivazione = azione con click singolo (Metodo1) Aspetto durante l’attivazione = contorni evidenziati (Metodo1) Effetto prodotto dall’attivazione = salvataggio dei dati inseriti (Metodo1) Attributi/Valori setEtichetta(Annulla) setForma(Rettangolare) setColore (Grigio) Comportamenti/Metodi Modalità di attivazione = azione con doppio click (Metodo2) Aspetto durante l’attivazione = contorni evidenziati (Metodo1) Effetto prodotto dall’attivazione = ripulisce i dati inseriti nella pagina (Metodo2)
Facciamo un secondo esempio: classe Motocicletta. OOP – ELEMENTI – CLASSI/OGGETTI/ATTRIBUTI/METODI Facciamo un secondo esempio: classe Motocicletta. DEFINIZIONE Classe Motocicletta Attributi Colore di tipo striga Stile: di tipo stringa Marca: di tipo stringa Comportamenti Avvia il motore: Metodo 1=funzionalità automatica Metodo 2 =funzionalità manuale Spegne il motore: Cambia marcia: Metodo 1=cambio automatico Metodo 2 = cambio manuale setColore() setStile() setMarca() getColore() getStile() getMarca()
Istanziamo due oggetti della classe motocicletta. OOP – ELEMENTI – CLASSI/OGGETTI/ATTRIBUTI/METODI Istanziamo due oggetti della classe motocicletta. Attributi/Valori setColore(Rosso) setStile(Enduro) setMarca(Honda) Comportamenti/Metodi Avvia il motore: funzionalità automatica (Metodo 1) Spegne il motore: funzionalità automatica (Metodo 1) Cambia marcia: cambio manuale (Metodo 2) Attributi/Valori setColore(Argento) setStile(Corsa) setMarca(BMW) Comportamenti/Metodi Avvia il motore: funzionalità manuale (Metodo 2) Spegne il motore: funzionalità manuale (Metodo 2) Cambia marcia: cambio manuale (Metodo 2) Istanza1 della classe Motocicletta : «Honda» Istanza 2 della classe Motocicletta : «BMW»
OOP – ELEMENTI – CLASSI/OGGETTI/ATTRIBUTI/METODI Definita una classe, per poterla usare quindi creare oggetti e manipolarla, è necessario creare un metodo chiamante «MAIN». Il Main è un metodo definito nella classe il cui scopo è proprio quello di gestire ed utilizzare la classe. Facciamo un esempio di sintassi Java della classe motocicletta dell’esempio. Class Motocicletta.docx
OOP – EREDITARIETA’ Nella programmazione ad oggetti è di particolare rilevanza il concetto di Ereditarietà Gerarchia delle classi. Generalmente nella programmazione ad oggetti le classi sono strutturate in una gerarchia ad albero. Le classi gerarchicamente inferiori ereditano le caratteristiche della classe madre. Gli attributi definiti privati non sono ereditati, per consentire l’ereditarietà gli attributi devono essere almeno protected.
OOP – EREDITARIETA’ Veicolo A due ruote Motocicletta scooter ciclomotore Quattro ruote Automobile Autocarro ……
OOP – POLIMORFISMO (overload e override) Il polimorfismo è un altro concetto fondamentale della programmazione ad oggetti. Il concetto di polimorfismo è relativo proprio al suo significato ovvero avere più forme, più aspetti. Per chiarire il concetto possiamo fare un semplice esempio di applicazione del polimorfismo nella vita reale: quando facciamo riferimento ad un computer probabilmente useremo lo stesso termine (computer, appunto) sia per identificare un computer desktop, un portatile o un netbook. Questo tipo di generalizzazione viene effettuata in quanto gli oggetti cui abbiamo fatto riferimento sostanzialmente effettuano le stesse operazioni... ma queste operazioni vengono fatte da oggetti con forme diverse (polimorfismo).
OOP – POLIMORFISMO (overload e override) Dal punto di vista implementativo il polimorfismo si applica nei metodi utilizzando l'overload e l'override. Cerchiamo di capire cosa significano i due termini. Un metodo è univocamente determinato dal suo nome e dalla lista di tutti i suoi parametri. Ciò permette, di fatto, di avere all'interno di una classe più metodi che hanno lo stesso nome ma con parametri diversi. L'overload si basa sulla scrittura di più metodi identificati dallo stesso nome che però hanno, in ingresso, parametri di tipo e numero diverso. Vediamo di seguito alcuni esempi di overload:
OOP – POLIMORFISMO (overload e override) Consideriamo una classe di operazioni sui numeri ed immaginiamo di implementare con l'overload due metodi che effettuano la somma tra due numeri interi e la differenza tra due numeri di tipo float (decimali). Avremo dunque: public class OperazioniSuNumeri { public int somma(int x, int y) { return x+y; } public float somma(float x, float y) { return x-y; Ogni volta che viene invocato il metodo somma, verranno controllati il tipo di parametri che gli sono stati passati ed in base a questa scelta, automaticamente, verrà richiamato il metodo appropriato.
OOP – POLIMORFISMO (overload e override) Con il termire override si intende una vera e propria riscrittura di un certo metodo di una classe che si è ereditato. Necessariamente, l'override implica ereditarietà. Per capirne il significato vero e proprio facciamo un esempio Consideriamo la classe "Dipendete "
OOP – POLIMORFISMO (overload e override) public class Dipendente{ private String nome; private String cognome; private int oreLavorativeMensili; private int retribuzioneOraria; public int getOreLavorativeMensili(){ return oreLavorativeMensili; } public int getRetribuzioneOraria(){ return restribuzioneOraria; public int stipendio(){ return oreLavorativeMensili * retribuzioneOraria;
OOP – POLIMORFISMO (overload e override) A questo ereditiamo la classe, creandone un'altra che modella il "RespondabileDiProgetto" che, oltre ad uno stipendio fisso, ha un attributo che rappresenta un bonus di produzione. Dunque la retribuzione di questo dipendente sarà data dalla somma dello stipendio base con l'eventuale bonus. Quindi il codice per la classe sarà il seguente: public class ResponsabileDiProgetto extends Dipendente { private int bonus; public int stipendio(){ int stipendioBase=(getOreLavorativeMensili() * getRetribuzioneOraria()); return stipendioBase + bonus; } Con l'override, è stato possibile ridefinire un metodo di una classe più generalista adattandolo così alla classe più specialista mantenendo comunque una coerenza per quanto riguarda la semantica del metodo che avrà lo stesso identico nome.