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