Programmazione a OggettiModulo B
Progetto
Dott. Alessandro Roncato
4/10/2011
2
Progetto
Da svolgere singolarmenteScadenza consegna: una settimana prima dello scritto;Valutazione in base a:Corretta compilazione ed esecuzioneAderenza ai principi della POFunzionalità
Inviare sorgenti progetto a [email protected]
3
Negozio
Scrivere un'applicazione Java per la gestione di una Negozio
L'applicazione dovrà consentire:Al proprietario di inserire nuovi prodotti, registrare il
ricevimento della merce, le vendite e i resiIl negozio vende vari tipi di prodotti che hanno
gestioni differenti (es. scadenza, i.v.a. etc. diverese)
Ulteriori dettagli emergeranno via via nel corso delle lezioni
4
Caratteristiche
Non interessano aspetti grafici o di animazione, stretto necessario per poter utilizzare il codice scritto.
Ecco un esempio di come potrebbe apparire una particolare funzionalità.
5
Esempio aspetto
E' preferibile che i controlli siano attivati/disattivati in funzione della possibilità o meno di fare quell'attività
6
Come iniziareNel Modulo B vedremo degli “esempi” (Design
Patterns) che aiuteranno a progettare il codice seguendo i paradigmi della programmazione a oggetti.
Inizieremo oggi cercando di capire come dividere il codice nei vari oggetti.
IMPORTANTE: prima di scrivere codiceBisogna capire cosa e come scriverlo
7
A cosa serve la progettazioneNei casi reali prima di realizzare un qualsiasi
manufatto è buona norma fare un progetto.Il progetto serve a:1) idea del risultato finale (+ modello in scala)2) stimare tempi e costi3) controllare che le varie componenti siano
compatibili tra di loro4) dividere il lavoro tra più persone5) etc.
8
A cosa serve la progettazionePrima di realizzare una qualsiasi applicazione è
buona norma fare un progetto.Il progetto serve a:1) idea del risultato finale (+ prototipo GUI)2) stimare tempi e costi3) controllare che le varie componenti siano
compatibili tra di loro4) dividere il lavoro tra più persone5) etc.
9
Quanti oggetti?
Se intendiamo gestire tutta la nostra applicazione con un unico oggetto, il risultato sarà molto simile all'approccio non orientato agli oggetti.
Un unico “spazio” e tutto il codice e i dati presenti in questo spazio saranno strettamente dipendenti.
10
Svantaggi unico oggetto
Non ho nessun vantaggio PODifficile riusoInterdipendenza codice altissimaDifficile debugDifficile manutenzioneDifficile da suddividere l'implementazione con più
persone
NON SCRIVERE CODICE E DIVIDERE POI!
11
Quanti oggetti?
Altra soluzione: un oggetto Java per ogni oggetto “reale”:Un oggetto Negozio Un oggetto Utente per ogni utenteUn oggetto Prodotto per ogni prodottoUn oggetto Scontrino per ogni Venditaetc.
ELENCARE TUTTI GLI OGGETTI
12
Vantaggi
Facilmente divisibili tra i vari sviluppatoriOgni singolo “componente” è facilmente
debuggabile, riusabile e mantenibileLo “spazio” di dipendenza “interna” del codice è
ridotto in quanto il codice è diviso in più partiC'é però interdipendenza “esterna” anche tra gli
spazi: come limitarla?
13
Quanti oggetti?
Visto che passando da un oggetto a tanti, abbiamo ottenuto dei vantaggi, perché non spingersi oltre e suddividere ulteriormente gli oggetti in modo da avere più oggetti Java di quelli del mondo reale?
Aumenta la dipendenza esterna tra oggetti È più difficile da suddividere il lavoro tra
programmatori
14
Quante classi?Tipi diversi di oggetti hanno bisogno di classi
diverse, quindi il numero di classi corrisponde al numero di oggetti diversi (questo vale per tutti i linguaggi a oggetti fortemente tipati).
Delle volte non è così semplice capire se due oggetti hanno bisogno di due classi diverse oppure se possono essere gestiti dalla stessa classe
15
Classi del progetto
1 oggetto di tipo Negozio => 1 classe NegozioTanti oggetti di tipo Scaffale => 1 classeTanti oggetti Utenti => 1 classeTanti oggetti di tipo Prodotto => 1 classe Prodotto
oppure 1 classe/interfaccia e più sottoclassi ( Alimentari, Riviste, Elettrodomestici, Casalinghi) ?
…
16
Cos'è la dipendenza esterna? (*)
C'è dipendenza esterna quando una classe “ha a che fare” con un'altra classe, cioè:1) Una classe estende un'altra classe2) Gli oggetti di una classe hanno una relazione con
oggetti di un'altra 3) Un metodo di una classe usa un oggetto di
un'altra classe
17
Esempio di dipendenza
Estensione: la classe Elettrodomestico estende la classe Prodotto
Relazione: un oggetto Scontrino è relativo a un Prodotto
Uso: probabilmente il metodo che “calcolaTotale” di un oggetto Carrello/Spesa avrà bisogno di accedere all'oggetto Prodotto per recuperare il prezzo.
18
Perché ridurre dipendenza?
Una modifica (per debug, manutenzione, riuso etc.) ad una classe implica una possibile modifica alle classi dipendenti
Quindi se due classi NON sono dipendenti, ho libertà di modificarle senza problemi
19
Come ridurre la dipendenza
Riducendo la parte “visibile” dalle classi.L'incapsulamento dei linguaggi ad oggetti
permette al compilatore di controllare la dipendenza tra classi
La parte visibile è costituita dagli attribiti pubblici
20
Incapsulamento
Incapsulamento codice = funzioni e procedureIncapsulamento dati = strutture (es. strutc
del C)Incapsulamento di codice (metodi) + dati
(variabili) + controllo visibilità = oggetti
21
A cosa serve?
L'incapsulamento permette di controllare le dipendenze esterne rendendo invisibili alcune parti (che chiameremo interne o private)
Oltre che al controllo della dipendenza, permette anche di evitare l'accesso non controllato rendendo più “affidabile” l'uso delle classi stesse
22
Analogia con il mondo reale
Gli oggetti di uso più comune (lavatrice, radio etc.) vengono incapsulati per rendere inaccessibili la parte interna. L'involucro (oltre a una funzione estetica che non ci interessa) permette di aumentare la semplicità d'uso dell'oggetto stesso e ne impedisce un uso improprio.
23
In pratica?
public class PRodott{private String nome;…private boolean isScaduto(){... }...public String getNome(){...}public double getPrezzo(){...}...} Dipendenza
24
Java BeanConvenzione Javanon ci sono campi (variabili d'istanza) pubblici;
public Type getNome()proprietà in lettura “nome” di tipo Typepublic void setNome(Type a)proprietà in scrittura “nome” di tipo Type(se il tipo è boolean get diventa is) public Oggetto () definito il costruttore di default
25
Ridurre dipendenza
public class Prodotto{ String nome; Lotto lotto; public String getNome(){return nome;} public void setNome(String n) {nome=n;} public boolean isScaduto() {return now().after(lotto.getScadenza()); } ...}
26
Come riduce dipendenza?
Contrariamente a quanto previsto, si scopre che la data di scadenza non è la stessa per tutti i prodotti dello stesso lotto.
Per questa ragione viene aggiunta anche la data di scadenza al singolo prodotto.
27
Come riduce dipendenza?
public class Prodotto{ String nome; Calendar scadenza; public String getNome(){return nome;} public void setNome(String n) {nome=n;} public boolean isScaduto() {return now().after(scadenza);} ...}
28
Come riduce dipendenza?
Anche se l'implementazione della classe è cambiata (aggiunta di un attributo e modifica di un metodo), dato che la parte pubblica (interfaccia) non è cambiata, le altre classi non vengono influenzate da questa modifica.
29
Quali classi?
Serve una classe per gli ScaffaliChe vantaggi e svantaggi ci sono?E per i Clienti Hanno bisogno di una classe o
basta una Stringa?Primo passo del progetto è elencare tutte le
classiSecondo è stabilire le relazioni tra classi
30
Tipi di relazioni (*)
Estensione (IS-A)
Associazioni
Dipendenze (uso di attributi)