Programmazione a Oggetti Modulo B Progetto Dott. Alessandro Roncato 4/10/2011
Progetto Da svolgere singolarmente Scadenza consegna: una settimana prima dello scritto; Valutazione in base a: Corretta compilazione ed esecuzione Aderenza ai principi della PO Funzionalità Inviare sorgenti progetto a roncato@dsi.unive.it 2
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 resi Il 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 3
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à. 4
Esempio aspetto E' preferibile che i controlli siano attivati/disattivati in funzione della possibilità o meno di fare quell'attività 5
Come iniziare Nel 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 codice Bisogna capire cosa e come scriverlo 6
A cosa serve la progettazione Nei 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 costi 3) controllare che le varie componenti siano compatibili tra di loro 4) dividere il lavoro tra più persone 5) etc. 7
A cosa serve la progettazione Prima 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 costi 3) controllare che le varie componenti siano compatibili tra di loro 4) dividere il lavoro tra più persone 5) etc. 8
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. 9
Svantaggi unico oggetto Non ho nessun vantaggio PO Difficile riuso Interdipendenza codice altissima Difficile debug Difficile manutenzione Difficile da suddividere l'implementazione con più persone NON SCRIVERE CODICE E DIVIDERE POI! 10
Quanti oggetti? Altra soluzione: un oggetto Java per ogni oggetto reale : Un oggetto Negozio Un oggetto Utente per ogni utente Un oggetto Prodotto per ogni prodotto Un oggetto Scontrino per ogni Vendita etc. ELENCARE TUTTI GLI OGGETTI 11
Vantaggi Facilmente divisibili tra i vari sviluppatori Ogni singolo componente è facilmente debuggabile, riusabile e mantenibile Lo spazio di dipendenza interna del codice è ridotto in quanto il codice è diviso in più parti C'é però interdipendenza esterna anche tra gli spazi: come limitarla? 12
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 13
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 14
Classi del progetto 1 oggetto di tipo Negozio => 1 classe Negozio Tanti oggetti di tipo Scaffale => 1 classe Tanti oggetti Utenti => 1 classe Tanti oggetti di tipo Prodotto => 1 classe Prodotto oppure 1 classe/interfaccia e più sottoclassi ( Alimentari, Riviste, Elettrodomestici, Casalinghi)? 15
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 classe 2) 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 16
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. 17
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 18
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 19
Incapsulamento Incapsulamento codice = funzioni e procedure Incapsulamento dati = strutture (es. strutc del C) Incapsulamento di codice (metodi) + dati (variabili) + controllo visibilità = oggetti 20
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 21
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. 22
In pratica? public class PRodott{ private String nome; private boolean isscaduto(){... }... public String getnome(){...} public double getprezzo(){...}... } Dipendenza 23
Java Bean Convenzione Java non ci sono campi (variabili d'istanza) pubblici; public Type getnome() proprietà in lettura nome di tipo Type public 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 24
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()); }... } 25
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. 26
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);}... } 27
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. 28
Quali classi? Serve una classe per gli Scaffali Che 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 classi Secondo è stabilire le relazioni tra classi 29
Tipi di relazioni (*) Estensione (IS-A) Associazioni Dipendenze (uso di attributi) 30