Programmazione Java Avanzata
Concetti di Java, parte 2
Ing. Giuseppe D'Aquì
Testi Consigliati
●
●
Java ( R. Liguori, P. Liguori), O'Reilly – Hops Tecniche Nuove
(2008)
Java Tutorials
●
●
SVN Book
●
●
[http://download.oracle.com/javase/tutorial/java/]
[http://svnbook.red-bean.com/nightly/en/index.html]
Git User Manual
●
[http://www.kernel.org/pub/software/scm/git/docs/user-manual.html]
Java Annotations
●
●
●
Dalla versione 5.0 Java ha introdotto dei meccanismi per inserire
metadati descrittivi nel codice stesso
Questi metadati (dati a proposito dei dati) possono essere usati
per rendere espliciti alcuni comportamenti
Siccome sono immersi nel codice, esistono analizzatori in grado
di adoperarli per semplificare il lavoro si sviluppo o potenziare il
Design By Contract
●
Es. @Override, @Deprecated
●
Molti framework definiscono annotation proprie
Annotations predefinite
●
@Override
●
●
@Deprecated
●
●
Dichiara che il metodo successivo deve prevalere
sul metodo della superclasse
Dichiara che il metodo successivo è deprecato
@SuppressWarnings
●
Dichiara che i warning di compilazione per il
metodo successivo devono essere trascurati
Annotations predefinite 2
●
@SuppressWarnings
●
Può avere uno di due argomenti:
–
“deprecation” - rimuove i warning sulle funzioni
deprecate
–
“unchecked” - rimuove i warning sull'uso dei Generics
Java Reflection
●
●
La Java Reflection Api è un insieme di classi e funzionalità che
vengono usate per conoscere e manipolare gli oggetti e i metodi
attualmente in esecuzione
Per esempio è possibile aggiungere o eliminare metodi alle
classi a run-time
●
●
●
Es. obj.getClass()
Può essere usato per rendere il codice illeggibile (spaghetticoding)
Viene usato più proficuamente per realizzare funzioni di analisi
del codice, usate dagli IDE e dai framework
Controllo di Versione
●
Version Control System (VCS)
●
●
Una branca del Software Change/Configuration
System (SCM)
Strumenti che permettono di verificare, per la
modifica di un software:
●
Cosa
●
Quando
●
Perché
Controllo di Versione: scopi
●
●
●
Automatizzare la fase di build e
shipping/deployment
Collaborazione
Rendere omogenei i processi di sviluppo di
differenti team nella stessa azienda
●
Documentare le modifiche
●
Analizzare e correggere le regressioni
Controllo di Versione: concetti
●
●
●
Ogni sviluppatore effettua una copia locale del
codice (checkout), su cui effettua le modifiche
Una volta terminato il lavoro, può verificare i
punti cambiati tramite diff
Se le modifiche vanno bene può spostarle su
un repository (deposito del codice) tramite
commit
Controllo di Versione: concetti 2
●
●
È possibile definire “linee di sviluppo” tramite
un'operazione detta branching
Se più sviluppatori stanno modificando la
stessa parte del software, si devono integrare
le tali modifiche con un merge
VCS Centralizzati
●
●
●
Repository
Un unico repository
I client hanno
ciascuno una copia
locale che
sincronizzano con il
server all'inizio e alla
fine del lavoro
Il server gestisce
l'autenticazione e i
permessi
Server RCS
Client
Client
Client
Copia
Locale
Copia
Locale
Copia
Locale
VCS Centralizzati: Pro e Contro
●
Pro:
●
●
●
Il codice “pulito” rimane in un unico luogo, quindi
il suo backup è più semplice
Ogni sviluppatore ha responsabilità di
“integratore” (ognuno può risolvere i propri
problemi di integrazione)
Contro:
●
●
Non si possono salvare le modifiche non complete
Ogni sviluppatore ha responsabilità di
“integratore” (un commit di un codice non
perfetto può causare danni a tutto il team)
Subversion
●
●
●
●
Subversion (in breve SVN) è un progetto della
Apache Software Foundation per il Controllo di
Versione Centralizzato
Sostituisce l'ormai obsoleto Concurrent Version
System (CVS)
Sebbene si stia diffondendo il modello
distribuito, SVN esiste ancora in molte aziende
Repository Open Source famosi:
●
Sourceforge
●
Google Code
Esercitazione
●
http://sourceforge.net/projects/win32svn
●
Subclipse
●
TortoiseSVN
●
gdata-api-client
VCS Distribuiti
●
●
●
Master
Repository
Ogni sviluppatore ha
il proprio repository
DVCS
Ogni repository è
indipendente
Per convenzione si
definisce un “master
repository” nel quale
viene inserito il
codice funzionante e
integrato
DVCS
DVCS
Repo1
Repo3
DVCS
Repo2
VCS Distribuiti: Pro e Contro
●
Pro:
●
●
●
Non c'è bisogno di essere “in sede”
Non c'è il rischio che un commit di un altro
sviluppatore blocchi il nostro backup
Contro:
●
●
Ogni repository ha bisogno di essere conservato
tramite backup
L'integrazione delle varie linee di sviluppo deve
essere coadiuvata da strumenti esterni di
collaborazione (wiki, bug tracking,
documentazione, etc) o da sviluppatori dedicati
Git
●
È il più famoso DVCS
●
Progettato per lo sviluppo del kernel Linux
●
Facilita la creazione di branch e i successivi
merge
●
Per Eclipse: EGit
●
Repository Open Source famosi:
●
●
GitHub
●
Gitorius
Altri DVCS diffusi sono Mercurial, Bazaar
Eclipse – Debug Java
●
●
Debug serve per individuare una porzione di
codice affetta da errori
Eclipse possiede al suo interno strumenti per il
debug di codice Java (e di altri linguaggi)
Eclipse – Debug Java 2
●
Funzionalità principali:
●
Breakpoint
●
Step-by-step
●
Visualizzazione variabili
Eclipse – Refactoring
●
●
●
Il Refactoring è una modifica al codice che non
punta a modificare la funzionalità del
software, ma la sua architettura interna
Per esempio, l'azione di rinominare una classe
o una funzione
I principali refactorings sono stati analizzati da
Martin Fowler nel libro omonimo
Eclipse – Principali Refactoring
●
Rename
●
Move
●
Encapsulate field
●
Extract method
●
Extract Class
●
Pull up/Push Down
Serializzazione
●
●
●
La Serializzazione, in Java, è la trasformazione
di un oggetto nella sua rappresentazione
binaria
Un oggetto serializzato può essere salvato su
disco, su database, inviato via internet etc
Gli oggetti, per essere serializzabili, devono
implementare l'interfaccia Serializable
Serializzazione 2
●
Ogni oggetto serializzabile deve avere una
variabile membro serialversionUID
●
●
È una sorta di hash che serve a controllare che non
vengano deserializzati oggetti di versioni diverse
Si possono utilizzare gli oggetti
ObjectInputStream e ObjectOutputStream