29/11/2004Laboratorio di Programmazione - Luca Tesei1 Ancora sulla progettazione/Pacchetti Concetti di coesione/accoppiamento/coerenza Uso dei package.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Funzioni e procedure Ogni linguaggio di programmazione ad alto livello mette a disposizione del programmatore questi strumenti, ed il C non è da meno!
Programmazione in Java
Recupero debito quarto anno Primo incontro
Informatica Recupero debito quarto anno Terzo incontro.
Introduzione alla programmazione A. Ferrari. Il linguaggio C Nel 1972 Dennis Ritchie nei Bell Laboratories progettò il linguaggio C Il linguaggio possiede.
If a cascata, switch, operatori logici
2/11/2004Laboratorio di Programmazione - Luca Tesei1 Progettazione Fase di progettazione di unapplicazione Fase di implementazione.
Linguaggi Regolari e Linguaggi Liberi
12/11/2004Laboratorio di Programmazione - Luca Tesei1 Caratteri – Input da Console Il tipo char Input dallo standard input.
26/10/2004Laboratorio di Programmazione - Luca Tesei1 Variabili e Oggetti Lo spazio di memoria di Java Le API di Java.
3/12/2004Laboratorio di Programmazione - Luca Tesei1 Sequenze di lunghezza variabile ArrayList Operazioni Ricerche.
5/11/2004Laboratorio di Programmazione - Luca Tesei1 Esercizi Su Progettazione e Implementazione di classi.
29/10/2004Laboratorio di Programmazione - Luca Tesei1 Metodi e variabili istanza Definizione e chiamata di metodi Uso delle variabili istanza Documentazione.
9/11/2004Laboratorio di Programmazione - Luca Tesei1 Tipi numerici di base - Costanti Interi e decimali Definizione di costanti.
22/10/2004Programmazione e Laboratorio di Programmazione – Luca Tesei1 Laboratorio – Primo Impatto Scrivere un semplice programma I primi concetti.
Programmazione e Laboratorio di Programmazione – Luca Tesei1 La Programmazione Cosè la programmazione? Concetti preliminari.
26/11/2004Laboratorio di Programmazione - Luca Tesei1 Input/Output Redirecting, scomposizione dellinput, uso di file.
2/11/2004Laboratorio di Programmazione - Luca Tesei1 Punto della situazione Da dove veniamo, dove andiamo.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Introduzione al linguaggio C
Fondamenti di Informatica
9/12/2004Laboratorio di Programmazione - Luca Tesei1 Ereditarietà
Interfacce. Interfacce come strumento di progetto Scelta delle classi di un progetto Criteri di coesione e accoppiamento Interfacce e riuso di codice.
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
1 Lezione XIII Lu 17-Nov-2005 Programmare le classi.
Soluzione Esercizio - Classe Vettore
Oggetti e dati primitivi Programmazione Corso di laurea in Informatica.
memoria gestita staticamente:
Programmazione con Interfacce
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Le funzioni.
IL CONCETTO DI PACKAGE Una applicazione è spesso composta di molte classi (eventualmente correlate) Un package è un gruppo di classi che costi- tuiscono.
Programmazione in Java
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
Creare pagine web Xhtlm. Struttura di una pagina.
11/11/2004Laboratorio di Programmazione - Luca Tesei1 Operazioni numeriche - Input Espressioni, funzioni matematiche, classi involucro, Acquisizione di.
BIOINFO3 - Lezione 331 SUBROUTINE IN PERL Una subroutine (funzione, metodo, procedura o sottoprogramma), e` una prozione di codice all`interno di un programma.
Fondamenti di Programmazione Prof.ssa Elisa Tiezzi
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
INTRODUZIONE A JAVASCRIPT
POSTA ELETTRONICA La posta elettronica è un’innovazione utilissima offerta da Internet. E’ possibile infatti al costo di una telefonata urbana (cioè del.
15/11/2004Laboratorio di Programmazione - Luca Tesei1 Costrutto condizionale Scelte, blocchi.
Corso di Algoritmi e Strutture Dati con Laboratorio A.A. 2014/15 Libreria standard.
JAVA Per iniziare. Verificare installazione javac –version java –version Cercare i files e sistemare eventualmente il path.
Una "vera" classe.. ..un esempio pratico: la calcolatrice
Programmazione ad oggetti
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
30/11/2004Laboratorio di Programmazione - Luca Tesei1 Interfacce e Polimorfismo.
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Commenti all’esempio del treno Nell’esempio del treno si è iniziato dalle attività generiche e/o attività operative che tipicamente costituiscono i passi.
Informatica 4 Funzioni. FUNZIONE: definizione MATEMATICA Relazione (o applicazione) binaria tra due insiemi A e B che associa a ogni elemento di A un.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
Fondamenti di informatica T-A Esercitazione 3 : Classi, metodi, visibilità, metodi statici AA 2012/2013 Tutor : Domenico Di Carlo.
13/08/02Input 1 Interagire con il computer Da tastiera Da riga di comando Funzioni di conversione.
28/12/2001package 1 Package Pacchetti e interfacce.
1 Metodo I metodi sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il.
Programmazione orientata agli Oggetti Introduzione a Java.
Introduzione alle Classi e agli Oggetti in Java 1.
Transcript della presentazione:

29/11/2004Laboratorio di Programmazione - Luca Tesei1 Ancora sulla progettazione/Pacchetti Concetti di coesione/accoppiamento/coerenza Uso dei package

29/11/2004Laboratorio di Programmazione - Luca Tesei2 Scelta delle classi Abbiamo già visto che per scrivere una buona applicazione usando un linguaggio ad oggetti come Java è bene fare unadeguata progettazione iniziale Il punto focale su cui concentrarsi sono le classi Nella programmazione funzionale classica ci si concentra sulle funzioni: sul flusso che il codice dovrebbe seguire Nella programmazione ad oggetti invece laccento è sulle entità, cioè gli oggetti appartenenti alle varie classi individuate I metodi, cioè la parte funzionale, devono essere pensati come associati alle entità

29/11/2004Laboratorio di Programmazione - Luca Tesei3 Scelta delle classi Uno degli aspetti fondamentali che sono indice di una buona progettazione è il seguente: Ogni classe dovrebbe rappresentare un singolo concetto

29/11/2004Laboratorio di Programmazione - Luca Tesei4 Scelta delle classi Abbiamo visto alcune classi che rappresentano concetti matematici o elementi della vita di tutti i giorni: –Rectangle –BankAccount –Purse Le proprietà degli oggetti di queste classi (variabili istanza) sono facili da capire, così come le operazioni che si possono eseguire su di essi (i metodi)

29/11/2004Laboratorio di Programmazione - Luca Tesei5 Scelta delle classi In generale i concetti che appartengono allambito dellapplicazione e che vengono identificati da sostantivi specifici sono ottimi candidati per essere classi Unaltra utile categoria di classi può essere descritta come quella degli attori: Gli oggetti di queste classi svolgono una serie di compiti. Esempi: –StringTokenizer –RandomNumberGenerator –GestoreNuoviConti

29/11/2004Laboratorio di Programmazione - Luca Tesei6 Scelta delle classi Abbiamo anche visto che in casi limitati è utile definire delle classi (o solo metodi, o solo variabili istanza) statiche quando vogliamo rappresentare qualcosa che si riferisce a tutti gli oggetti di una data classe (costanti pubbliche, variabili statiche) o a funzionalità correlate (metodi statici come ad esempio tutti quelli raggruppati nella classe Math ) di utilità. Infine abbiamo visto le classi di Test che hanno come scopo quello di contenere un metodo main per testare funzionalità di classi definite precedentemente ed indipendentemente.

29/11/2004Laboratorio di Programmazione - Luca Tesei7 Scelta delle classi Quale potrebbe essere una classe poco valida? In generale sono sintomi di errori di progettazione: –Se dal nome di una classe non si capisce cosa dovrebbero fare gli oggetti della classe stessa –Se il nome di una classe non rappresenta un gruppo di entità, ma una specifica funzione Es: classi come CalcolaBustaPaga oppure PogrammaPerIlPagamento

29/11/2004Laboratorio di Programmazione - Luca Tesei8 Coesione e accoppiamento Vediamo due criteri utili per analizzare la qualità di una interfaccia pubblica di una classe: –Coesione –Accoppiamento

29/11/2004Laboratorio di Programmazione - Luca Tesei9 Coesione Un classe dovrebbe rappresentare, abbiamo detto, un singolo concetto I metodi e le costanti pubbliche che sono elencati nellinterfaccia dovrebbero avere una buona coesione, cioè tutte le caratteristiche dellinterfaccia dovrebbero essere strettamente correlate al singolo concetto rappresentato dalla classe Se così non è forse è meglio usare classi separate

29/11/2004Laboratorio di Programmazione - Luca Tesei10 Coesione Consideriamo ad esempio linterfaccia della classe Purse : public class Purse { public Purse() {...} public void addNickels(int count) {...} public void addDimes(int count) {...} public void addQuarters(int count) {...} public double getTotal() {...} public static final double NICKEL_VALUE = 0.05; public static final double DIME_VALUE = 0.1; public static final double QUARTER_VALUE = 0.25; }

29/11/2004Laboratorio di Programmazione - Luca Tesei11 Coesione Se ci pensiamo bene in realtà sono persenti due concetti diversi in questa classe: 1.Borsellino che calcola il valore totale delle monetine che contiente 2.Valore delle singole monetine Potrebbe avere più senso definire una classe separata Coin i cui oggetti rappresentano singole monete ognuna con il proprio valore. La classe Purse dovrebbe allora cambiare interfaccia e permettere di inserire nel borsellino oggetti della classe Coin

29/11/2004Laboratorio di Programmazione - Luca Tesei12 Coesione public class Coin { public Coin (double aValue, String aName) {...} public double getValue() {...}... } public class Purse { public void add(Coin aCoin) {...} public double getTotal() {...}... }

29/11/2004Laboratorio di Programmazione - Luca Tesei13 Coesione È evidente che questa è una soluzione migliore dal punto di vista della progettazione Abbiamo usato la prima soluzione negli esempi precedenti solo per avere un esempio semplice

29/11/2004Laboratorio di Programmazione - Luca Tesei14 Dipendenza fra classi Molte classi hanno bisogno di altre classi per svolgere il loro compito Per esempio la classe Purse appena vista dipende dalla classe Coin per determinare il valore totale delle monete In generale una classe A dipende da una classe B se A usa istanze della classe B

29/11/2004Laboratorio di Programmazione - Luca Tesei15 Dipendenza fra classi UML -Unified Modeling Language- è un linguaggio grafico standardizzato per lanalisi e la progettazione orientata agli oggetti UML rappresenta, nei diagrammi di classi, la dipendenza tra classi con una linea tratteggiata che termina con una freccia aperta da una certa classe A a unaltra classe B dove A dipende da B

29/11/2004Laboratorio di Programmazione - Luca Tesei16 Dipendenza fra classi Purse Coin Purse dipende da Coin È la stessa notazione grafica che usa Bluej

29/11/2004Laboratorio di Programmazione - Luca Tesei17 Accoppiamento Se in unapplicazione molte classi dipendono una dallaltra diciamo che cè un elevato accoppiamento tra le classi Perché laccoppiamento è importante? Se la classe Coin viene modificata in una versione successiva del programma allora tutte le classi che dipendono da lei possono richiedere una modifica! Se la modifica è drastica tutte le classi accoppiate devono essere aggiornate

29/11/2004Laboratorio di Programmazione - Luca Tesei18 Accoppiamento Inoltre, se vogliamo usare una classe A in un altro programma, siamo costretti ad usare anche tutte le classi da cui A dipende Quindi, in generale, è bene ridurre al minimo laccoppiamento tra le classi della propria applicazione Ovviamente ci sono alcuni casi in cui laccoppiamento è necessario e non si può eliminare!

29/11/2004Laboratorio di Programmazione - Luca Tesei19 Coerenza La coesione e laccoppiamento sono buoni criteri da seguire per analizzare una progettazione In aggiunta un altro criterio è quello di guardare la coerenza nella definizione dei metodi per quanto riguarda i nomi e i parametri La presenza di schemi coerenti è sempre segno di buona fattura

29/11/2004Laboratorio di Programmazione - Luca Tesei20 Coerenza Brutti esempi di incoerenza si trovano anche nelle librerie standard di Java! Ad esempio abbiamo visto che per far aprire una finestra di dialogo per prendere un input basta chiamare JOptionPane.showInputDialog( promptString); Tuttavia per far apparire una finestra per visualizzare solo un messaggio siamo costretti ad usare JOptionPane.showMessageDialog(null, messageString);

29/11/2004Laboratorio di Programmazione - Luca Tesei21 Coerenza A cosa serve null ? Se guardiamo le API vediamo che il metodo ha bisogno di un parametro che gli indichi la finestra di appartenenza oppure null se non ha una finestra di appartenenza Perché questa incoerenza? Non cè nessun motivo... Bastava fornire due metodi showMessageDialog di cui uno con un solo parametro stringa, come è stato fatto per showInputDialog

29/11/2004Laboratorio di Programmazione - Luca Tesei22 Coerenza Le incoerenze non sono errori gravissimi, ma perché non evitarle soprattutto quando si può farlo facilmente?

29/11/2004Laboratorio di Programmazione - Luca Tesei23 Metodi accessori/modificatori Abbiamo detto che è sempre meglio incapsulare tutto lo stato degli oggetti ed eventualmente, poi, mettere a disposizione dei metodi get/set per accedere a certe variabili istanza in maniera controllata

29/11/2004Laboratorio di Programmazione - Luca Tesei24 Effetti collaterali In generale un metodo qualsiasi (non statico) di una classe può cambiare il valore di una variabile istanza qualsiasi delloggetto su cui è chiamato, ma anche su altri oggetti della stessa classe! Abbiamo visto che il meccanismo per la chiamata dei metodi congela le attivazioni precedenti a quelle del metodo in esecuzione Pertanto la visibilità dello stato da parte di un metodo è limitata

29/11/2004Laboratorio di Programmazione - Luca Tesei25 Effetti collaterali In particolare non sono visibili le variabili di frame dichiarate in tutte le attivazioni precedenti Come variabili di frame sono visibili solo il parametro implicito this e i parametri del metodo I parametri che non sono di tipo riferimento ad oggetto sono variabili locali al metodo: i valori che contengono vengono passati dallambiente chiamante, ma eventuali loro modifiche non si riflettono allesterno (passaggio dei parametri per valore)

29/11/2004Laboratorio di Programmazione - Luca Tesei26 Effetti collaterali Tuttavia laccesso allo heap, e quindi agli oggetti, non è ristretto Se un oggetto –riceve come parametri variabili riferimento ad altri oggetti oppure –ha nel suo stato riferimenti ad altri oggetti può tranquillamente accedere ai loro campi (rispettando comunque i vincoli espressi da private ) e chiamare su di loro metodi

29/11/2004Laboratorio di Programmazione - Luca Tesei27 Effetti collaterali: esempio public class BankAccount { /** Trasferisce denaro da questo conto a un altro amount la somma da other il conto su cui trasferire public void transfer(double amount, BankAccount other) { balance = balance – amount; other.balance = other.balance + amount; }... }

29/11/2004Laboratorio di Programmazione - Luca Tesei28 Effetti collaterali: esempio other è un parametro di tipo riferimento ad oggetti della classe BankAccount balance è una variabile privata della classe BankAccount e transfer è un metodo della classe BankAccount : quindi, per le regole di visibilità, transfer può accedere al balance delloggetto puntato da other

29/11/2004Laboratorio di Programmazione - Luca Tesei29 Effetti collaterali: esempio Lesecuzione del metodo transfer fa avvenire una modifica al di fuori dello stato delloggetto su cui il metodo è stato chiamato In particolare viene modificato lo stato di un altro oggetto della stessa classe (ma in generale può essere modificato lo stato anche di oggetti di altre classi) In questi casi si dice che il metodo in questione ha effetti collaterali

29/11/2004Laboratorio di Programmazione - Luca Tesei30 Effetti collaterali Anche operazioni di visualizzazione di messaggi sullo standard output allinterno di un metodo vengono considerate un effetto collaterale E se la vostra classe un giorno fosse usata su un hardware che non è dotato di un dispositivo di ouput simile a una console? Se succede qualcosa di sbagliato dentro un metodo la cosa migliore da fare è segnalarlo al chiamante con una eccezione o con la restituzione di un valore in uscita particolare (es –1 del metodo read() delle classi FileInputStream o FileReader )

29/11/2004Laboratorio di Programmazione - Luca Tesei31 Effetti collaterali La conclusione è: È buona norma evitare di scrivere metodi con effetti collaterali

29/11/2004Laboratorio di Programmazione - Luca Tesei32 Pacchetti Abbiamo spesso importato nei nostri programmi classi della libreria standard Abbiamo visto, nelle API, che queste sono raggruppate in pacchetti ( package ) Anche noi possiamo definire uno o più pacchetti personali che contengono le nostre classi!

29/11/2004Laboratorio di Programmazione - Luca Tesei33 Nomi di pacchetti Un nome di pacchetto, abbiamo visto, è una serie di stringhe separate da punti: –java.lang –javax.swing –... Per indicare una classe che si trova allinterno di un pacchetto va aggiunto al nome del pacchetto un punto e il nome della classe: –java.lang.String –javax.swing.JOptionPane

29/11/2004Laboratorio di Programmazione - Luca Tesei34 Nomi di pacchetti Se vogliamo creare un nostro pacchetto è bene seguire, per scegliere il nome, la procedura seguente: Indicare come prefisso del nome del pacchetto il nome rovesciato del dominio internet della propria azienda/organizzazione/università Questo perché esiste un organismo mondiale che controlla che non ci siano conflitti fra i nomi dei domini

29/11/2004Laboratorio di Programmazione - Luca Tesei35 Nomi di pacchetti Di riflesso avremo che non ci saranno mai conflitti fra i nomi delle nostre classi e quelle scritte da altri programmatori in tutto il mondo Ad esempio un nome per il pacchetto che contiente tutti gli esempi che abbiamo visto in questo corso potrebbe essere: it.unicam.informatica.LabDiProgr

29/11/2004Laboratorio di Programmazione - Luca Tesei36 Nomi di pacchetti Se volete pubblicare vostre classi personali potete usare anche il vostro indirizzo Ad esempio può usare come prefisso dei suoi pacchetti com.hotmail.pippo

29/11/2004Laboratorio di Programmazione - Luca Tesei37 Creare un pacchetto Per creare un pacchetto dobbiamo innanzitutto raggruppare i sorgenti delle classi in una cartella e inserire allinizio di ogni file sorgente la riga: package nomePacchetto ; Poi bisogna inserire questa cartella allinterno di una gerarchia di sottocartelle che riflettono il nome del pacchetto

29/11/2004Laboratorio di Programmazione - Luca Tesei38 Creare un pacchetto Nel nostro caso, ad esempio, dovremmo mettere le nostre classi allinterno di una cartella di nome LabDiProgr inserita in una cartella di nome informatica a sua volta inserita in unicam a sua volta inserita in it

29/11/2004Laboratorio di Programmazione - Luca Tesei39 Creare un pacchetto Dopodiché compilare tutte le classi dal livello più alto: #My Documents> javac it\unicam\informatica\LabDiProgr \*.java

29/11/2004Laboratorio di Programmazione - Luca Tesei40 Usare le classi di un pacchetto Se volessimo a questo punto usare la classe BankAccount definita nel nostro pacchetto dovremmo importarla come import it.unicam.informatica.LabDiProgr BankAccount; Allinterno del file sorgente possiamo evitare di scrivere tutto il nome ed usare solo BankAccount

29/11/2004Laboratorio di Programmazione - Luca Tesei41 Usare le classi di un pacchetto Ovviamente possiamo anche importarle tutte: import it.unicam.informatica.LabDiProgr *; Se ci dovessero essere conflitti (ad esempio se abbiamo definito una classe String anche nel nostro pacchetto) possiamo risolverli specificando tutto il nome (unico) della classe nel pacchetto: java.lang.String per quella della distribuzione java e it.unicam.informatica.LabDiProgr String per la nostra

29/11/2004Laboratorio di Programmazione - Luca Tesei42 Usare le classi di un pacchetto Infine, per permettere ad un programma di usare le nostre classi, dobbiamo porre il percorso con cui arrivare alla cartella it allinterno della variabile di ambiente CLASSPATH oppure inserire tale percorso nella chiamata delle compilazioni/esecuzioni tramite lopzione – cp: #> javac –cp percorsoPerIt nomeClasse.java #> java –cp percorsoPerIt nomeClasse