JAVA - Programmazione Orientata agli Oggetti (OOP) PDF

Title JAVA - Programmazione Orientata agli Oggetti (OOP)
Course Programmazione orientata agli oggetti
Institution Sapienza - Università di Roma
Pages 42
File Size 210 KB
File Type PDF
Total Downloads 364
Total Views 796

Summary

__CONCETTI BASE DELLA PROGETTAZIONE DEL SOFTWARE___ Introduzione alla progettazione del software Contesto organizzativo Ciclo di vita del software Qualità Modularizzazione Principi di base dell’orientazione agli oggetti _ Classificazione delle applicazioni Rispetto al flusso di controllo Sequenziali...


Description

16/10/2020

codeprinter

______________________________________________________________________________ CONCETTI BASE DELLA PROGETTAZIONE DEL SOFTWARE ______________________________________________________________________________ _ Introduzione alla progettazione del software – Contesto organizzativo – Ciclo di vita del software – Qualità – Modularizzazione – Principi di base dell’orientazione agli oggetti _ Classificazione delle applicazioni Rispetto al flusso di controllo • Sequenziali: un unico flusso di controllo governa l’evoluzio • Concorrenti: le varie attività necessitano di sincronizzazio • Composte da varie attività sequenziali che possono (e devono al fine di garantire la correttezza • Il tempo di esecuzione influenza le prestazioni, non la corr • Dipendenti dal tempo: esistono vincoli temporali riguardanti esecuzione delle attività sia la necessità di sincroni Rispetto agli elementi di interesse primario • Orientate alla realizzazione di funzioni: la complessità pre riguarda le funzioni da realizzare • Orientate alla gestione dei dati: l’aspetto prevalente è rap vengono memorizzati, ricercati, e modificati, e che co informativo di una organizzazione • Orientate al controllo: la complessità prevalente del sistem delle attività che si sincronizzano e cooperano durant _ Ciclo di vita del software 1. Studio di fattibilità e raccolta dei requisiti – valutare costi e benefici – pianificare le attività e le risorse del progetto – individuare l'ambiente di programmazione (hardware/software) – raccogliere i requisiti 2. Analisi dei requisiti – si occupa del cosa l’applicazione dovrà realizzare – descrivere il dominio dell’applicazione e specificare le fun componenti: lo schema concettuale 3. Progetto e realizzazione – si occupa del come l’applicazione dovrà realizzare le sue fu – definire l'architettura del programma – scegliere le strutture di rappresentazione – scrivere il codice del programma e produrre la documentazion 4. Verifica – Il programma svolge correttamente completamente efficiente

16/10/2020

codeprinter

INTERNE Efficienza Strutturazione Modularità Comprensibilità Verificabilità Manutenibilità Portabilità _ Correttezza, Affidabilità,Robustezza, Sicurezza, Innocuità • Correttezza (è fondamentale) il software fa quello per il quale è stato progettato • Affidabilità: si può fare affidamento sulle funzionalità del softwar rispettati à risultati disponibili • Robustezza: comportamento accettabile anche nel caso di situazioni n previste nella specifica dei requisiti • Innocuità: il sistema non entra in certi stati (pericolosi) • Sicurezza: riservatezza nell’accesso alle informazioni _ Usabilità • Enfasi sull’utente • Psicologia cognitiva • Fattori fisici/ergonomici • Mentalità dell’utente • Interfacce grafiche/visuali • Viene, spesso, totalmente ignorata _ Estendibilita Facilità con cui il SW può essere adattato a modifiche delle specifiche Nota: Importantissimo in grandi programmi Nota: Due principi per l'estendibilità: • Semplicità di progetto • Decentralizzazione nell'architettura del SW _ Riusabilità Facilità con cui il SW può essere re-impiegato in applicazioni diverse da quella originaria Nota: Evita di reinventare soluzioni Nota: Richiede alta compatibilità – Libreria di componenti riutilizzabili – Progetto più generale possibile – Documentazione – Maggiore affidabilità

16/10/2020

codeprinter

• Legata alle prestazioni (quest’ultime percepibili dall’utente, quind _ Qualità in contrasto • Non tutte le qualità possono essere massimizzate • Alcune sono intrinsecamente in contrasto fra loro. Ad esempio: – Usabilità e sicurezza – Efficienza e portabilità • È necessario scegliere un adeguato bilanciamento _ Principi guida nello sviluppo del software In base alle tendenze descritte precedentemente si attualmente si cons sviluppo del software i seguenti principi: • Rigore e formalità – Lo sviluppo del software è una attività creativa che va acco rigoroso (o addirittura formale: in logica o matematica) permette di reali controllarne il costo, aumentare la fiducia nel loro corretto funzionamento. • Separazione degli interessi – Affrontare separatamente i diversi aspetti per dominare la c • Modularità – Realizza la separazione degli interessi in 2 fasi: • Tratta i dettagli di singoli moduli in modo separato • Tratta separatamente dai dettagli interni dei singol sussistono tra i moduli stessi • Astrazione – Identifica aspetti fondamentali ed ignora i dettagli irrilev • Anticipazione del cambiamento – Per favorire l’estendibilità e il riuso • Generalità – Ricerca di soluzioni generali • Incrementalità – Per anticipare feedback dell’utente per facilitare verifiche predisporsi alla estendibilità e al riuso _ Modularizzazione • Principio secondo il quale il software è strutturato secondo unità, appunto moduli • Un modulo è una unità di programma con le seguenti caratteristiche: – ha un obiettivo chiaro – ha relazioni strutturali con altri moduli – offre un insieme ben definito di servizi agli altri moduli ( – può utilizzare servizi di altri moduli (client)

16/10/2020

codeprinter

– le informazioni che non devono essere scambiate devono esser modulo _ Principi per la modularità In sintesi, i quattro dogmi della modularizzazione sono: • Alta coesione (omogeneità interna) • Basso accoppiamento (indipendenza da altri moduli) • Interfacciamento esplicito (chiare modalità d’uso) • Information hiding (poco rumore nella comunicazione) _ Concetti di base dell'approccio OO • Oggetti – Descrivere i dati come oggetti sui quali si possono esegure • Classi – Raggruppare oggetti simili in unità, dette «classi», dove ne struttura e il comportamento. • Astrazione – Il meccanismo con cui si specifica le caratteristiche peculi differenzia da altri • Ereditarietà – Gli oggetti sono definiti in una gerarchia di generalizzazio dagli «antenati» caratteristiche comuni, che possono essere specializzate • Polimorfismo – Possibilità di eseguire funzioni con lo stesso nome che pure per una particolare classe _ Fattori di qualità influenzati dall'approccio OOP ESTERNE Correttezza Affidabilità Robustezza Sicurezza Innocuità Usabilità Estendibilità favorita dalla ereditarietà Riusabilità favorita dal concetto di classe e di ereditarietà Interoperabilità INTERNE Efficienza

16/10/2020

codeprinter

(espressione booleana)?: Semantica Il risultato dell'espressione condizionale è dato dal primo va condizione booleana è vera, oppure dal secondo valore se la condizione è falsa. Esempio int x,y; …. // x e y diversi System.out.println((xy?x:y));

_ Classi associate ai tipi primitivi Per ogni tipo primitivo esiste la corrispondente classe associata (denominata classe wrapper) byte short int long float double char boolean Byte Short Integer Long Float Double Character Boolean _ Conversione STRING to INT String s = JOptionPane.showInputDialog("Inserisci un numero"); int x = Integer.parseInt(s); _ Generare numero random int x =(int) (Math.random () * 6 + 1); // numero intero tra 1 e 6 _ Overloading di metodi • L’overloading di metodi è presente quando si usano gli stessi nomi p metodi diversi • La segnatura di ciascun metodo coinvolto dal processo di overloading essere unica • La segnatura include il numero, tipo e l’ordine dei parametri • Il tipo del valore di ritorno di un metodo fa parte della segnatura? – OOP in generale: sì – Java: no • Il compilatore determina la versione del metodo da invocare analizza _ Passaggio dei parametri •Tipi di dato primitivi passaggio per valore •Riferimenti ad oggetti passaggio per valore (che però è riferimento ad un oggetto su _ Variabili statiche con valori costanti tipo FINAL public static final tipo nomeVariabile=valore; Esempio: public class Utilita { public static final int ZERO=0;

16/10/2020

codeprinter

int float, double char boolean class C

0 0.0 '\0' false null

Queste inizializzazioni non sono effettuate per le variabili locali de _ Costruttore Il costruttore standard (che non fa nulla), viene generato per ogni cl Qualora sia definito un qualsiasi costruttore, la generazione automati viene inibita, quindi se si necessita di un costruttore senza parametri, questo va es _ Ciclo for migliorato int sum=0; for ( int n : numbers ){ sum += n ; } _ Copia riferimento ad array su array int[] numbers = primes; numbers[5] = 42; // ora anche primes[5] vale 42 _ Copia contenuto array su array (Arrays.copyOf) int[] copiedPrimes = Arrays.copyOf(primes,primes.lenght); _ Stampare un elenco degli elementi di un array bidimensionale a scopo di debu System.out.println(Arrays.deepToString(nomearraybidimensionale)); _ Tipi di eccezioni (1) • Due categorie – eccezioni controllate • dovute a circostanze esterne che il programmatore no • il compilatore vuole sapere cosa fare nel caso si ve – eccezioni non controllate • dovute a circostanze che il programmatore dovrebbe e accuratamente il docide _ Eccezioni controllate • Tutte le sottoclassi di IOException – EOFException – FileNotFoundException – MalformedURLException – UnknownHostException – ClassNotFoundException

16/10/2020

codeprinter

• Metodo ereditato dalla classe Throwable: – String getMessage() restituisce come stringa il messaggio co • Quando l’eccezione viene lanciata: – può essere già stata creata o venir creata contestualmente • Garbage collector: distrugge solo le eccezioni che sono state cattur _ Custom Exception import java.io.*; class ClasseEcc { void ff() throws IOException { Exception ec = new Exception("Prima eccezione"); InputStreamReader isr = new InputStreamReader(System.i BufferedReader br = new BufferedReader(isr); int i = Integer.parseInt(br.readLine()); try { if (i == 1) throw ec; throw new Exception("Altra eccezione"); } catch(Exception e) { System.out.println(e.getMessage()); } System.out.println("Prosecuzione della funzione"); } public static void main (String[] args) throws IOException { ClasseEcc ex = new ClasseEcc(); ex.ff(); System.out.println("Prosecuzione del programma"); } } _ Lanciare eccezioni • Per lanciare un’eccezione, usiamo la parola chiave throw (lancia), s tipo eccezione throw exceptionObject; • Il metodo termina immediatamente e passa il controllo al gestore del – Le istruzioni successive non vengono eseguite Esempio: public class BankAccount { public void withdraw(double amount) { if (amount > balance) throw new IllegalArgumentException(“Sa insufficiente");

16/10/2020

codeprinter

throws public void read(BufferedReader in) throws IOException Esempio: public class Coin { public void read(BufferedReader in) throws IOException { value = Double.parseDouble(in.readLine()); name =in.readLine(); } ... } La clausola throws segnala al chiamante di Coin.read che esso generare un’eccezione di tipo IOException _ Usare le eccezioni di Run Time • Le eccezioni di runtime (RuntimeException) possono essere utilizzate dovuti ad input errati. • Esempi: – Un metodo che preleva soldi da un conto corrente non può pre maggiore del saldo – Un metodo che effettua una divisione non può dividere un num _ Custom Exception Example: Divisione per zero public class DivisionePerZeroException extends RuntimeException{ public DivisionePerZeroException() { super("Divisione per zero!"); } public DivisionePerZeroException(String msg) { super(msg); } } public class Divisione { public Divisione(int n, int d) { num=n; den=d; } public double dividi(){ if (den==0) throw new DivisionePerZeroException(); return num/den; }

16/10/2020

codeprinter

res = div.dividi(); System.out.print(res); } catch(DivisionePerZeroException exception) { System.out.println(exception); } } } Cosa fa l’istruzione "System.out.println(exception);" ? – Invoca il metodo toString() della classe DivisioneperZeroExc • Ereditato dalla classe RuntimeException • Restituisce una stringa che descrive l’oggetto Excep – Il nome della classe a cui l’oggetto apparti seguito da : e dal messaggio di errore associa all’oggetto SAMPLE OUTPUT: Inserisci il numeratore:5 Inserisci il denominatore:0 DivisionePerZeroException: Divisione per zero! • DivisionePerZeroException e la classe a cui l’oggetto except • Divisione per zero! è il messaggio di errore associato all’o costruttore) _ Clausola FINALLY • Il lancio di un’eccezione arresta il metodo corrente • A volte vogliamo eseguire altre istruzioni prima dell’arresto • La clausola finally viene usata per indicare un’istruzione/blocco ch try { enunciato enunciato ... } finally { enunciato enunciato ... } _ Criteri di classificazione degli STREAM • Possiamo quindi classificare gli stream sulla base di tre criteri: –Direzione: input o output –Tipo di dati: byte o caratteri –Scopo: collegamento con una dispositivo/file o manipolazione

16/10/2020

codeprinter

ByteArrayOutputStream FileOutputStream ObjectOutputStream PipedOutputStream FilterOutputStream BufferedOutputStream DataOutputStream PrintStream Stream di caratteri Reader (Input di caratteri) BufferedReader CharArrayReader InputStreamReader FileReader StringReader PipedReader FilterReader Writer (Output di caratteri) BufferedWriter CharArrayWriter OutputStreamWriter FileWriter StringWriter PipedWRiter FilterWriter PrintWriter _Example: PrintWriter video = new PrintWriter(System.out); video.println(12); video.println(“Ciao”); video.println(13,56); _ Lettura/Scrittura file: -FileInputStream -FileOutputStream • • • • •

Sono sottoclassi di InputStream e OutputStream Aprono stream di byte da/verso file Hanno gli stessi metodi di InputStream e OutputStream Si possono applicare i filtri (ad esempio DataInputStream e Costruttori: – public FileInputStream(File file) throws FileNotFoun – public FileInputStream(String name) throws FileNotFo

16/10/2020

codeprinter

– Alcuni livelli tipici, in ordine decrescente • SEVERE: problema molto grave • WARNING: avvertimento potenz. grave • INFO: messaggio informativo sul funzionam. • FINE: messaggio di “tracing” • FINEST: messaggio di “tracing” dettagliato _ Derivazione -Tutte le proprietà definite per la classe base vengono implicitamente classe derivata cioè vengono ereditate da quest’ultima. -La classe derivata può avere ulteriori proprietà -Ogni oggetto della classe derivata è anche un oggetto della classe ba oggetto della classe derivata in ogni situazione/contesto in cui si può usare base -Non è vero che un oggetto della classe base è anche un oggetto della possibile usare un oggetto della classe base laddove si può usare un oggetto d -Una classe derivata può fungere da classe base per ulteriori derivazi public class B {…} public class D extends B {…} public class E extends D {…} -Una classe può avere un numero qualsiasi di classi derivate public class B {…} public class D extends B {…} public class Dbis extends B {…} -Riferimenti di diverse classi possono denotare lo stesso oggetto WRONG: public class B {…} public class D extends B { int x_d; } … D d = new D(); d.x_d = 10; B b = d; //OK b e d denotano lo stesso ogg. b.x_d = 20; //NO x_d non è un campo di B! //type checking statico CORRECT: public class B {…} public class D extends B { int x_d; } … D d = new D(); d.x_d = 10; B b = d; //OK b e d denotano lo stesso ogg. ((D)b).x_d = 20; //OK (D)b è un riferimento di tipo D

16/10/2020

codeprinter

this("Mario Rossi"); } public Persona(String n) { this(n,null); } public Persona(String n, String r) { nome = n; residenza = r; } //campi funzione (metodi) public String getNome() { return nome; } public String getResidenza() { return residenza; } public void setResidenza(String nuovaResidenza) { residenza = nuovaResidenza; } } _ Summary: Principi fondamentali della derivazione Principio 1: la classe derivata eredita le proprietà (campi) della cla Principio 2: può avere ultriori proprietà Principio 3: è compatibile con la classe base Principio 4: ma non il viceversa _ Note sull'overriding -È possibile cambiare il livello di accesso della funzione ridefinita -È possibile bloccare l’overriding di una funzione qualificandola fina -L'overriding di campi non esiste! Il campo della classe derivata nasc base che però resta accessibile utilizzando riferimenti del tipo base. Esempio //SovrascritturaCampiDati public class B { int i; } public class D extends B { char i; void stampa() { System.out.println(i); System.out.println(super.i); } }

16/10/2020

codeprinter

Definizione: è una astrazione per un insieme di funzioni pubbliche, delle q segnatura ma non il corpo. -Una classe implementa l’interfaccia definendo TUTTE le funzioni previ _ Summary interface Una interfaccia è simile ad una classe dove non possono essere present costanti statiche…). Inoltre tutte le funzioni sono astratte (segnatura, ma non corpo). Le interfacce rappresentano collezioni di funzionalità messe a disposi implementano _ Differenza tra interface e classi abstract -una classe astratta è una classe, cioè una astrazione di un insieme d delle sue sottoclassi) -una interfaccia è una semplice astrazione di un insieme di funzionali _ Altro su interfacce -Una classe può implementare un'interfaccia public interface I { void g(); } public interface J { void h(); } public class C implements I,J { void g(){…} void h(){…} } -Una interfaccia può essere derivata da un’altra interfaccia public interface I { void g(); } public interface J extends I {void h();} public class C implements J { void g(){…} void h(){…} } -Java supporta public public public

ereditarietà multipla per le interfacce (non per le cla interface I {void g();} interface J {void h();} interface M extends I,J {void k();}

public class void void void

C implements M { g(){…} h(){…} k(){ }

16/10/2020

codeprinter

public B(int x) { i = x; } public String toString() { return "i } public class D extends B { private int j; public D(int x, int y) { super(x); j = y; } public String toString() { return super.toString() + " j: " + } } public class EsempioToStringDerivata { public static void main(String[] arg D d = new D(5,10); System.out.println(d); } } /* Stampa: i: 5 j: 10 */ -public Final Class getClass(); -public boolean equals(Object o); -protected Object clone(); -public int hashCode(); -etc... _ La classe Class -Nella JVM esiste implicitamente un oggetto della classe Class per ogn del programma. C.class Class: Class c = … -Class non ha costruttori accessibili ai clienti _ La funzione isInstance boolean isInstance (Object o) _La funzione restituisce true se o denota un oggetto che è istanza del rappresentata dall’oggetto di invocazione. Si usa per verificare se un oggetto è istanza di una classe. Example:

16/10/2020

codeprinter

} _Inoltre la funzione può essere usata per verificare se un oggetto imp _Example: //EsempioIsInstance2 public interface I {} public class D implements I {} public class EsempioIsIntance2{ public static void main(String[] args) { I i1 = new D(); D d1 = new D(); System.out.println(I.class.isInstance(i1)); System.out.println(I.class.isInstance(d1)); System.out.println(D.class.isInstance(d1)); System.out.println(D.class.isInstance(i1)); } }

//"true" //"true" //"true" //"true"

_ L'operatore instanceof -Serve a verificare se un oggetto è istanza di una classe (o implement -In particolare, le seguenti espressioni sono identiche: C.class.isInstance(c) … c instanceof C … _ La funzione getClass() di Object: Restituisce il riferimento all’oggetto Class che rappresenta la classe dell’oggetto di invocazione Serve per verificare a runtime di che tipo è l’oggetto di invocazione riferimento usato per denotarlo _ Uguaglianza tra oggetti: Uguaglianza superficiale: due riferimenti denotano lo stesso oggetto Uguaglianza profonda: le informazioni (rilevanti) contenute nell’ogget _ equals(): -Se non ridefinita, equals(), si comporta come == verificando l'uguagl -Si può tramite overriding di equals() effettuare l'uguaglianza profon per fare overriding di equals() in modo corretto dobbiamo segu //Pattern per l'overriding di equals() public class B { private int x, y;

16/10/202...


Similar Free PDFs