Programmazione a Oggetti Modulo B - dsi.unive.itpo/2011/SlidesB/Lezione1.pdf · seguendo i...

Post on 18-Feb-2019

220 views 0 download

transcript

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 roncato@dsi.unive.it

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)