Ancora Progettazione, Packages. Scelta delle classi. Scelta delle classi. Scelta delle classi

Documenti analoghi
Ancora Progettazione, Packages

Ancora sulla progettazione/pacchetti

Scelta delle classi. Ancora sulla progettazione/pacchetti. Scelta delle classi. Scelta delle classi. Scelta delle classi. Scelta delle classi

Rectangle BankAccount Purse

Esercizio: la classe CashRegister

Tipi numerici di base - Costanti

Una classe Borsellino. Tipi numerici di base - Costanti. Esempio d uso. Classe Borsellino cont d. Primi passi per l implementazione di Purse

Esercizio: la classe CashRegister

Definiamo la prima classe vera. Concetti fondamentali 2. Il corpo del metodo. Definizione di un metodo

Interfacce. Organizzazione di una classe. Organizzazione di una classe. Classi di un progetto. Classi di un progetto

Metodi e variabili istanza

Operazioni numeriche - Input

Input. Il tipo char Alcune modalità di acquisizione di input. Laboratorio di Programmazione - Luca Tesei

Capitolo 13: Gestione delle eccezioni. Capitolo 13. Gestione delle eccezioni Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2

L oggetto creato. Creazione di Oggetti. Rectangle: il concetto 10. Costruzione. Lo spazio di memoria del linguaggio Java. Rectangle: l oggetto

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

Programmazione Orientata agli Oggetti in Linguaggio Java

Progettazione di classi

Fondamenti di informatica T-1 (A K) Esercitazione 2 Basi del linguaggio Java

Usare e costruire oggetti. Concetti Fondamentali. Interfaccia Pubblica di una. Application Program Interface

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

Oggetti. La programmazione orientata agli oggetti, OOP (Object-Oriented Programming), prende il nome dall elemento su cui si basa, l oggetto.

Progettazione di classi

DataSet. Interfacce e Polimorfismo. DataSet per BankAccount. DataSet per BankAccount. DataSet per Coin. DataSet per Coin

Primi programmi in Java. Lezione II

Variabili e Parametri. Scope, Lifetime Inizializzazione

Variabili e Parametri

CLASSI e FILE I PACKAGE

Scelte. Costrutto condizionale. Il costrutto if. Il costrutto if. Rappresentazione con diagramma a blocchi. Il costrutto if

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Dispensa 07. Oggetti e Java. Marzo Programmazione Java 1

Programmazione I - corso B a.a prof. Viviana Bono

Programmazione orientata agli oggetti Classi, package e file system. Package

Programmazione orientata agli oggetti Classi, package e file system. Package

Lezione 5 Namespace e JavaDoc

Programmazione A.A Costrutti di base. ( Lezione XII, parte I ) Gestione dell input. Prof. Giovanni Gallo Dr.

Corso sul linguaggio Java

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Programmazione M.A. Alberti. Comunicazione digitale AA 2009/ Classi in Java 1. Le classi in Java. Oggetti. Classi. Classi. Visibilità dei dati

Definizione di classi. Walter Didimo

Modulo 2: Strutture fondamentali della programmazione Java

Introduzione all uso degli oggetti in Java (parte I) Walter Didimo

Programmazione Orientata agli Oggetti in Linguaggio Java

IL CONCETTO DI PACKAGE

Capitolo 4. Tipi di dati fondamentali. Cay S. Horstmann Concetti di informatica e fondamenti di Java quarta edizione

Il concetto di Package

Corso di Informatica Modulo T3 2 Ambiente locale e globale

Java e i Tipi di dati primitivi. Parte 3

LABORATORIO DI PROGRAMMAZIONE TURNO 3 (SERALE)

Le basi del linguaggio Java

CLASS DIAGRAM PARTE 1

Esempio 2: Subtyping

Introduzione alla programmazione orientata agli oggetti (prima parte) Rel 1.0

Programmazione in Java e gestione della grafica (I modulo) Lezione 2: Prime nozioni di Java

14 - Metodi e Costruttori

Fondamenti di informatica T-1 (A K) Esercitazione 2: Linguaggio Java, basi e controllo del flusso

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

UML I diagrammi implementativi

I Metodi. Fondamenti di Informatica A-K

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Java: Definire Classi e Creare Oggetti

UML Introduzione a UML Linguaggio di Modellazione Unificato. Corso di Ingegneria del Software Anno Accademico 2012/13

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Definizione di metodi in Java

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Uso di classi e oggetti. Prof. Francesco Acarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Programmazione Orientata agli Oggetti in Linguaggio Java

perror: individuare l errore quando una system call restituisce -1

Programmazione a Oggetti Lezione 11. Eccezioni e Packages

Programmazione a Oggetti Modulo B

Concetti base. Java - package 2

PROGRAMMAZIONE: I sottoprogrammi

Fondamenti di Informatica T-1

Concetti principali Ereditarietà e (overriding) di metodi. Ereditarietà e costruttori Livelli di accesso protected e package La classe Object

Passare argomenti al programma

Fondamenti di Programmazione Prof.ssa Elisa Tiezzi. Programmazione orientata a oggetti

Capitolo 9 Interfacce e polimorfismo

Dichiarazione di una classe. Dichiarazione ereditarietà

Programmazione in Java e gestione della grafica. Lezione 6

Il linguaggio C. Puntatori e dintorni

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

Access 2007 Colonna di ricerca

Programmazione ad oggetti

Introduzione a Visual Studio 2005

Oggetti. Oggetti e classi. Utilizzo di classi. Classe

Inizializzare oggetti

L AMBIENTE CODE BLOCKS E L IO

Classi ed Oggetti. Fondamenti di Informatica A-K

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Modello procedurale versus modello O-O

L AMBIENTE CODE BLOCKS E L IO

Microsoft Visio 2002 UML Sergio Colosio

I metodi statici non hanno il parametro implicito

Transcript:

Ancora Progettazione, Packages Concetti di coesione/accoppiamento/coerenza Uso dei package Abbiamo già visto che per scrivere una buona applicazione usando un linguaggio ad oggetti come Java è bene fare un adeguata 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 l accento è sulle entità, cioè gli oggetti appartenenti alle varie classi individuate I metodi, cioè la parte funzionale, devono essere pensati come associati alle entità 1 2 Uno degli aspetti fondamentali che sono indice di una buona progettazione è il seguente: Ogni classe dovrebbe rappresentare un singolo concetto 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) 3 4

In generale i concetti che appartengono all ambito dell applicazione e che vengono identificati da sostantivi specifici sono ottimi candidati per essere classi Un altra 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 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, oppure per far partire l'applicazione vera e propria 5 6 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 e accoppiamento Vediamo due criteri utili per analizzare la qualità di una interfaccia pubblica di una classe: Accoppiamento 7 8

Un classe dovrebbe rappresentare, abbiamo detto, un singolo concetto I metodi e le costanti pubbliche che sono elencati nell interfaccia dovrebbero avere una buona coesione, cioè tutte le caratteristiche dell interfaccia dovrebbero essere strettamente correlate al singolo concetto rappresentato dalla classe Se così non è forse è meglio usare classi separate Consideriamo ad esempio l interfaccia 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; } 9 10 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 11 public class Coin { public Coin (double avalue, String aname) {...} public double getvalue() {...}... } public class Purse { public void add(coin acoin) {...} public double gettotal() {...}... } 12

È 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 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 13 14 Dipendenza fra classi Dipendenza fra classi UML - Unified Modeling Language - è un linguaggio grafico standardizzato per l analisi 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 un altra classe B dove A dipende da B Purse dipende da Coin Purse Coin È la stessa notazione grafica che usa Bluej 15 16

Accoppiamento Se in un applicazione molte classi dipendono una dall altra diciamo che c è un elevato accoppiamento tra le classi Perché l accoppiamento è 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 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 l accoppiamento tra le classi della propria applicazione Ovviamente ci sono alcuni casi in cui l accoppiamento è necessario e non si può eliminare! 17 18 Coerenza Coerenza La coesione e l accoppiamento 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 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); 19 20

A cosa serve null? Coerenza 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 Coerenza Le incoerenze non sono errori gravissimi, ma perché non evitarle soprattutto quando si può farlo facilmente? 21 22 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 Effetti collaterali In generale un metodo qualsiasi (non statico) di una classe può cambiare il valore di una variabile istanza qualsiasi dell oggetto 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 23 24

Effetti collaterali 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 dall ambiente chiamante, ma eventuali loro modifiche non si riflettono all esterno (passaggio dei parametri per valore) Tuttavia l accesso 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 dagli specificatori di accesso) e chiamare su di loro metodi 25 26 Effetti collaterali: esempio Effetti collaterali: esempio public class BankAccount { /** Trasferisce denaro da questo conto a un altro conto @param amount la somma da trasferire @param other il conto su cui trasferire public void transfer(double amount, BankAccount other) { balance = balance amount; other.balance = other.balance + amount; }... } 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 dell oggetto puntato da other 27 28

Effetti collaterali: esempio L esecuzione del metodo transfer fa avvenire una modifica al di fuori dello stato dell oggetto 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 Effetti collaterali Anche operazioni di visualizzazione di messaggi sullo standard output all interno 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 30 La conclusione è: Effetti collaterali È buona norma evitare di scrivere metodi con effetti collaterali Naturalmente sono fatti salvi i casi in cui lo scopo del metodo sia proprio quello di modificare altri oggetti 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! 31 32

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 all interno di un pacchetto va aggiunto al nome del pacchetto un punto e il nome della classe: java.lang.string javax.swing.joptionpane 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 33 34 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: Nomi di pacchetti Se si vogliono pubblicare delle proprie classi personali si può usare anche l'indirizzo email: Ad esempio pippo@hotmail.com può usare come prefisso dei suoi pacchetti com.hotmail.pippo it.unicam.cs.labprogrammazione 35 36

Creare un pacchetto Creare un pacchetto Per creare un pacchetto dobbiamo innanzitutto raggruppare i sorgenti delle classi in una cartella che ha lo stesso nome del pacchetto e inserire all inizio di ogni file sorgente la riga: package nomepacchetto; Poi bisogna inserire questa cartella all interno di una gerarchia di sottocartelle che riflettono il nome del pacchetto Nel nostro caso, ad esempio, dovremmo mettere le nostre classi all interno di una cartella di nome LabProgrammazione inserita in una cartella di nome cs a sua volta inserita in unicam a sua volta inserita in it 37 38 Creare un pacchetto Usare le classi di un pacchetto Dopodiché si devono compilare tutte le classi dal livello più alto: #My Documents> javac it\unicam\cs\labprogrammazione\*.java Se volessimo a questo punto usare la classe BankAccount definita nel nostro pacchetto dovremmo importarla come import it.unicam.cs.labprogrammazione.banka ccount; All interno del file sorgente possiamo evitare di scrivere tutto il nome ed usare solo BankAccount 39 40

Usare le classi di un pacchetto Per lanciare il main Ovviamente possiamo anche importarle tutte: import it.unicam.cs.labprogrammazione.*; 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.cs.labprogrammazione.string per la nostra 41 Se si vuole lanciare il main di una classe che si trova in un certo pacchetto costruito da noi dobbiamo dare il comando java dalla dal livello di cartella più alto e specificare l'intero nome della classe Ad esempio, per far partire il main della nostra BankAccount: C:\MyDocuments> java it.unicam.cs.labprogrammazione.bank Account 42 Usare le classi di un pacchetto Infine, per permettere ad un'altra applicazione di usare le nostre classi, dobbiamo porre il percorso con cui arrivare alla cartella it all interno della variabile di ambiente CLASSPATH oppure inserire tale percorso nella chiamata delle compilazioni/esecuzioni tramite l opzione cp: #>javac cp percorsoperit nomeclasse.java #>java cp percorsoperit nomeclasse 43