Dopo una piccola introduzione al linguaggio Groovy, dove verranno illustrate brevemente alcune peculiarit, si passer ad esaminare le caratteristiche che lo rendono adatto per la generazione di DSL.
Verr quindi presentato come caso pratico la costruzione di una DSL e sar mostrato come 竪 possibile embeddarla in un progetto Java.
This document provides an introduction to unit testing and design patterns in Java. It discusses the value of unit testing in improving code quality and safety. It defines what a design pattern is, including different types of patterns like creational, structural, and behavioral patterns. It also gives examples of some basic patterns like Singleton and Iterator. The document is intended to provide an overview of these important concepts in software design.
This document discusses building Java applications. It explains that all Java programs are built from classes, which contain fields to store data and methods to operate on that data. Every application needs a main class with a main method, which acts as the entry point for the program. The main method executes first when the program starts. The document provides an example of a simple Java application class with a main method that prints a string to the console. It describes how instances of a class are used to acquire and work with data, while the class describes the data and behavior.
Il corso consente ai partecipanti di apprendere la sintassi del linguaggio di programmazione Java, la programmazione orientata agli oggetti con Java, la creazione di interfacce grafiche utente (GUI), la gestione delle eccezioni, le funzionalit di I/O per i file, i thread e le funzioni di rete. I programmatori che gi hanno familiarit con i concetti della programmazione object-oriented potranno imparare a sviluppare applicazioni Java. I contenuti fanno riferimento alla piattaforma Java Platform, Standard Edition 6 (Java SE 6) e al prodotto Java SE Development Kit 6 (JDK 6). Le esercitazioni pratiche prevedono l'uso dell'IDE (Integrated Development Environment) NetBeans 5.5.
The course aims to provide you with an understanding of the fundamental concepts involved in object-oriented programming (object, class, protocol, hierarchy, inheritance, encapsulation, polymorphism and collaboration).
The programming language you will use is Java. However, the purpose of the course is not to teach you the minutiae of the Java language, but rather to teach you fundamental object-oriented programming concepts and skills that will be transferable to any object測 oriented language
Programmazione a oggetti tramite la macchina del caff辿 (1/3)Marcello Missiroli
油
Una introduzione semplice e (spero) intuitiva al mondo della programmazione a oggetti usando come riferimento una macchina del caff辿 (tipo Nespresso) (1/3)
Versione 2: tolto qualche refuso, aggiunto un paio di slide chairificatori.
Il Corso Programmazione Java Base di K-Tech (http://www.k-tech.it) ha come obiettivo quello di far comprendere le tecniche di programmazione orientata agli oggetti, cio竪 di modellare e pensare a oggetti, di trasmettere i concetti base del linguaggio e le basi per sviluppare piccole applicazioni in modo autonomo.
Il corso Programmazione Java Base 竪 composto da dodici moduli:
1. Introduzione
2. Ciclo di sviluppo
3. Sintassi Elementare
4. Principi OOP
5. Classi e Oggetti
6. Concetti Object Oriented
7. Collections
8. Eccezioni
9. Input Output
10. Serialization
11. Unit Testing
12. Threads
Leggi il programma completo: http://www.k-tech.it/formazione/catalogo/programmazione_java_base
Questo progetto ha come argomento principale la "Domotica" e consiste nel controllo di un dispositivo elettrico a distanza attraverso il protocollo HTTP appoggiandosi sulla piattaforma Open Source Arduino.
Dopo una piccola introduzione al linguaggio Groovy, dove verranno illustrate brevemente alcune peculiarit, si passer ad esaminare le caratteristiche che lo rendono adatto per la generazione di DSL.
Verr quindi presentato come caso pratico la costruzione di una DSL e sar mostrato come 竪 possibile embeddarla in un progetto Java.
This document provides an introduction to unit testing and design patterns in Java. It discusses the value of unit testing in improving code quality and safety. It defines what a design pattern is, including different types of patterns like creational, structural, and behavioral patterns. It also gives examples of some basic patterns like Singleton and Iterator. The document is intended to provide an overview of these important concepts in software design.
This document discusses building Java applications. It explains that all Java programs are built from classes, which contain fields to store data and methods to operate on that data. Every application needs a main class with a main method, which acts as the entry point for the program. The main method executes first when the program starts. The document provides an example of a simple Java application class with a main method that prints a string to the console. It describes how instances of a class are used to acquire and work with data, while the class describes the data and behavior.
Il corso consente ai partecipanti di apprendere la sintassi del linguaggio di programmazione Java, la programmazione orientata agli oggetti con Java, la creazione di interfacce grafiche utente (GUI), la gestione delle eccezioni, le funzionalit di I/O per i file, i thread e le funzioni di rete. I programmatori che gi hanno familiarit con i concetti della programmazione object-oriented potranno imparare a sviluppare applicazioni Java. I contenuti fanno riferimento alla piattaforma Java Platform, Standard Edition 6 (Java SE 6) e al prodotto Java SE Development Kit 6 (JDK 6). Le esercitazioni pratiche prevedono l'uso dell'IDE (Integrated Development Environment) NetBeans 5.5.
The course aims to provide you with an understanding of the fundamental concepts involved in object-oriented programming (object, class, protocol, hierarchy, inheritance, encapsulation, polymorphism and collaboration).
The programming language you will use is Java. However, the purpose of the course is not to teach you the minutiae of the Java language, but rather to teach you fundamental object-oriented programming concepts and skills that will be transferable to any object測 oriented language
Programmazione a oggetti tramite la macchina del caff辿 (1/3)Marcello Missiroli
油
Una introduzione semplice e (spero) intuitiva al mondo della programmazione a oggetti usando come riferimento una macchina del caff辿 (tipo Nespresso) (1/3)
Versione 2: tolto qualche refuso, aggiunto un paio di slide chairificatori.
Il Corso Programmazione Java Base di K-Tech (http://www.k-tech.it) ha come obiettivo quello di far comprendere le tecniche di programmazione orientata agli oggetti, cio竪 di modellare e pensare a oggetti, di trasmettere i concetti base del linguaggio e le basi per sviluppare piccole applicazioni in modo autonomo.
Il corso Programmazione Java Base 竪 composto da dodici moduli:
1. Introduzione
2. Ciclo di sviluppo
3. Sintassi Elementare
4. Principi OOP
5. Classi e Oggetti
6. Concetti Object Oriented
7. Collections
8. Eccezioni
9. Input Output
10. Serialization
11. Unit Testing
12. Threads
Leggi il programma completo: http://www.k-tech.it/formazione/catalogo/programmazione_java_base
Questo progetto ha come argomento principale la "Domotica" e consiste nel controllo di un dispositivo elettrico a distanza attraverso il protocollo HTTP appoggiandosi sulla piattaforma Open Source Arduino.
2. Di cosa parleremo Differenze tra programmazione strutturata e programmazione ad oggetti Concetti fondamentali della OOP ( O bject O riented P rogramming) Classi ed istanze La OOP ed i costrutti Java
3. Caratteristiche della Programmazione strutturata /1 La Programmazione strutturata si basa su alcuni basilari principi Esistono le variabili locali e globali (strutture dati) Esiste il concetto di blocco di istruzioni (funzione e/o procedura) che esegue un compito preciso utilizzando le variabili locali e/o globali le variabili contengono i dati su cui il programma agisce Le funzioni rappresentano la logica (algoritmo) da applicare sui dati per ottenere un risultato I dati e le funzioni sono disaccoppiati nel senso che una funzione non possiede l'accesso esclusivo ad un dato
4. Caratteristiche della Programmazione strutturata /2 Il celebre libro di Niklaus Wirth palesa come nella programmazione strutturata la somma di Algoritmi e Strutture Dati produca i programmi Nella OOP la separazione tra Algoritmi e Strutture Dati sparisce (o quasi). Questa 竪 una delle pi湛 significative differenze tra i due paradigmi di programmazione
5. Concetti generali della OOP Cosa 竪 un oggetto Incapsulamento (information hiding) Ereditariet Polimorfismo
6. Cosa 竪 un oggetto Un oggetto 竪 una entit software dotata di Stato Comportamento Pensiamo all'entit software Animale, un animale pu嘆 mangiare e muoversi, ha un nome e pu嘆 essere affamato In genere i verbi indicano comportamento (muoversi, mangiare) i sostantivi (nomi) indicano lo stato (nome,et) questa regola non e' perfetta ma 竪 abbastanza precisa
7. Definiamo una entit Oggetto Animale Stato Nome Fame Colore Comportamento Mangiare Muoversi Parlare (nel senso di emettere suoni)
8. Fido e Polly Stato e Comportamento Animale fido = new Cane(Fido); fido.muovi(); fido.parla(); // baubau // Verifico lo stato fido.getNome(); // Fido fido.getFame(); // poca fido.muovi(); fido.getFame(); // molta polly = new Pappagallo(Polly); polly.muovi(); // si muove sul trespolo non vola! polly.parla(); // mi chiamo pooolly // Verifico lo stato polly.getNome(); // Polly
9. Come sono legati stato e comportamento? Animale fido.muovi(); // Verifico lo stato fido.getFame(); // poca polly.muovi(); // Verifico lo stato polly.getFame(); L'algoritmo presente in muovi agisce sullo stato fame cambiando i valori di alcune variabili (strutture dati) contenute negli oggetti Non sappiamo nulla su come funziona l'algoritmo che probabilmente 竪 diverso per ogni animale Riepilogando si pu嘆 dire che nella OOP in generale Lo stato cambia impostando i valori di variabili (es. fame = 100) Il comportamento lavora sulle variabili (es. incrementa il valore)
10. Incapsulamento /1 La fame di Fido e Polly aumenta pi湛 velocemente se si muovono Quando la fame 竪 al massimo supponiamo che si rifiutino di muoversi Richiamando il metodo mangia() Fido riprender a camminare. Posso leggere lo stato fame con getFame() e cambiarlo con mangia(), non posso dare dei valori non previsti allo stato: questo 竪 Incapsulamento o information hiding
11. Incapsulamento /2 L'information hiding nasconde i dettagli implementativi impedisce di falsare lo stato dell'oggetto con dei valori non ammessi. I valori delle variabili possono essere cambiati solo dall'oggetto e non dall'esterno
12. Ereditariet /1 Sia Fido che Polly sono animali Essi hanno in comune molte caratteristiche Nome (stato) Si muovono (comportamento) Queste propriet sono dell'entit Animale e le entit Cane e Pappagallo le ereditano
15. Ereditariet /4 Ereditariet significa avere un oggetto base con un insieme di stati e comportamenti presenti anche in oggetti derivati* Si parla di gerarchia di oggetti quando un oggetto possiede dei discendenti che a loro volta ne hanno altri (si pensi all'albero genealogico) * ereditare e derivare sono sinonimi in OOP
16. Ereditariet /5 Se Fido e Polly sono uguali all'oggetto Animale che bisogno c'竪 di creare due nuovi oggetti Cane e Pappagallo? Si sarebbe potuto scrivere qualcosa di pi湛 semplice fido = new Animale ("Fido") invece di fido = new Cane ("Fido") polly = new Animale ("Polly") invece di polly = new Pappagallo ("Polly") Gli oggetti hanno caratteristiche comuni ma non sono uguali!! Fido corre pi湛 velocemente di Polly Polly pu嘆 volare ed anche il suono emesso 竪 diverso Il comportamento cambia e questo si chiama Polimorfismo
17. Polimorfismo /1 Preso da Wikipedia, significa assumere significati specifici in diversi contesti Nel mondo OOP significa la capacita' di ridefinire il comportamento di un oggetto Sia Fido che Polly hanno un metodo parla ma il risultato 竪 un p嘆 diverso... Il metodo parla 竪 ereditato dall'entit Animale
18. Polimorfismo /2 Nel caso di Fido e Polly significa che il comportamento applicato, ad esempio, nel metodo muovi cambia negli oggetti Cane e Pappagallo Comportamento = Algoritmo; quindi il metodo Cane.muovi() e Pappagallo.muovi() contengono codice diverso
19. Relazioni tra classi Le classi possono essere in relazione tra loro come Associazione (uso di oggetti) Aggregazione (contenimento di oggetti) Specializzazione (ereditariet)
20. Relazioni / Associazione Una classe si dice in associazione con un'altra quando esiste un legame debole o nullo Supponiamo che esista una classe Collare, Fido potrebbe avere un attributo (field) di questo tipo. Fido per嘆 pu嘆 tranquillamente esistere senza collare (legame debole) quindi l'attributo collare della classe pu嘆 essere vuoto
21. Relazioni / Aggregazione Una classe si dice in aggregazione con un'altra quando esiste un legame forte Supponiamo che Fido abbia l'attributo et, questo attributo deve esistere ed avere un valore valido (legame forte) La differenza tra Associazione e Aggregazione 竪 molto sottile spesso ci si limita a dire che una classe ha un attributo di un'altra e questo attributo pu嘆 essere null oppure valorizzato
22. Relazioni / Specializzazione Una classe si dice specializzazione di un'altra quando deriva da essa Cane o Pappagallo sono specializzazioni di Animale Animale 竪 detta classe base
23. La fattoria degli animali in Java Tutti i concetti OOP trovano diretto riscontro nella sintassi del linguaggio Java Incapsulamento (Information hiding) Ereditariet Polimorfismo Prima di vedere questi aspetti prendiamo confidenza con la sintassi specifica di Java
24. Definire un oggetto in Java Java utilizza la parola riservata class per definire un oggetto class 竪 un contenitore di variabili (che in java di chiamano field) funzioni (che in java si chiamano metodi) nome 竪 una variabile getNome e setNome sono due metodi class Animale { String nome ; String getNome() { return nome ; } void setNome(String nuovoNome){ nome = nuovoNome; } }
25. Metodi con nomi "speciali" class Animale { String nome ; String getNome() { return nome ; } void setNome(String nuovoNome){ nome = nuovoNome; } } Java usa una convenzione per i nomi dei metodi. Essendo una convenzione non 竪 obbligatoria ma caldamente consigliata. Tutti i metodi che restituiscono il valore di un field hanno il prefisso get Tutti i metodi che impostano il valore di un field hanno il prefisso set
26. Getter e setter I getter e setter sono normali metodi, e' solo una convenzione "umana" quella di avere i getter che non prendono argomenti di avere i setter che prendono un solo argomento Nulla vieta di avere un setter che non riceve nessun argomento oppure un getter che prende uno o piu' argomenti Un oggetto contenente getters e setters viene chiamato Java bean Si consiglia l'attenta lettura della naming convention http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html
27. Istanze di oggetti Una volta definito il contenuto di una classe con field e metodi per utilizzarlo bisogna istanziarlo Questo viene fatto con l'operatore new di Java che alloca in memoria un nuovo oggetto del tipo richiesto Animale fido = new Animale(); Ne consegue che Una classe rappresenta la definizione di un oggetto Una istanza 竪 la sua struttura in memoria sulla quale 竪 possibile cambiare il valore dei field
28. Istanze e costruttori Quando si crea un nuovo oggetto, ovvero una istanza, si richiama uno speciale metodo chiamato costruttore Il costruttore ha lo stesso nome della classe e non ritorna niente Possono esserci pi湛 costruttori per una classe a patto che prendano parametri diversi Se non viene dichiarato nessun costruttore Java ne crea uno automaticamente che azzera tutti i field e non riceve argomenti Si chiama costruttore di default
29. Esempi di costruttori public class Animale { } public class Animale { public Animale() { } } Le classi sono identiche, quella a destra viene generata in fase di compilazione da Java. Attenzione! Non viene modificato il sorgente ma 竪 la classe compilata che in assenza di un costruttore viene creata con quello di default public class Animale { public Animale() { } public Animale(String nome) { } public Animale(String nome) { } } public class Animale { public Animale() { } public Animale(String nome) { } public Animale(String nome, String razza) { } }
30. Information Hiding e violazione Il contenuto della variabile 'nome' pu嘆 essere cambiato facilmente senza nessun controllo public class ProvaAnimaleSenzaInformationHiding { public static void main(String[] args) { Animale fido = new Animale(); fido. nome = "aaa" ; } } Questa 竪 una violazione dell'IH Non abbiamo adeguatamente nascosto la variabile da modifiche arbitrarie
31. Java ed i livelli di Information Hiding (IH) In Java 竪 possibile scegliere chi deve vedere cosa . I field ed i metodi possono avere differenti livelli di IH Esistono tre livelli di IH public tutti possono vedere e/o modificare il field e/o il metodo protected solo le classi derivare possono vedere e/o modificare il field e/o il metodo private solo la classe contenente il field e/o il metodo pu嘆 accederci Esiste un quarto livello, package, ma non 竪 si utile ai nostri scopi
32. Diminuiamo la visibilit class Animale { String nome ; String getNome() { return nome ; } void setNome(String nuovoNome){ nome = nuovoNome; } } class Animale { private String nome ; String getNome() { return nome ; } void setNome(String nuovoNome){ nome = nuovoNome; } } Cosa cambia Con questa piccola modifica la classe xxx non compila pi湛. Abbiamo impedito modifiche dirette al field 'nome' Anche protected avrebbe nascosto la visibilit. Domanda: Cosa avrebbe fatto invece public ? Domanda: Come faccio a cambiare il nome adesso?
33. Best practices per l'information hiding E' pratica diffusa e altamente consigliabile definire i field sempre private definire i metodi che devono restituire o impostare lo stato di un field public definire i metodi che non aggiungono significato all'oggetto come protected o private (ad esempio un metodo che controlla la validit del field 'nome')
34. Overloading Abbiamo visto che una classe pu嘆 avere pi湛 di un costruttore, purch竪 gli argomenti differiscano per numero oppure per tipo Questa caratteristica si chiama Overloading Tutti i metodi, non soltanto i costruttori, possono fare overloading public class Animale { public void muovi() { } public void muovi(double centimetri) { } }
35. Esercizi cosa sapere Cosa sapere per svolgere gli esercizi Per stampare a video una stringa System.out.println("hello"); Se ad una stringa non viene assegnato nessun valore, viene impostata a null (null e' una parola riservata Java) Per avviare una classe inserire il metodo main public static void main(String[] args) { }
36. Esempio Scrivere la classe Animale contenente il metodo getNome() Scrivere la classe TestAnimale con il metodo main che stampa il nome di una istanza Animale public class Animale { public String getNome() { return "Polly" ; } } public class TestAnimale { public static void main(String[] args) { Animale animale = new Animale(); System. out .println(animale.getNome()); } }
37. Esercizio 1 Definire una classe Gatto il cui costruttore prende un nome Definire una classe Canarino il cui costruttore prende un nome Definire una classe Fattoria che memorizza il gatto ed il canarino ha un metodo stampaNomiAnimali che stampa tutti I nomi degli abitanti della fattoria Definire una classe TestFattoria (con il main) che Istanzia un gatto di nome "Silvestro" ed un un canarino di nome "Titti" istanzia una fattoria Inserisce il gatto ed il canarino nella fattoria Richiama il metodo stampaNomiAnimali Usare getters, setters e l'information hiding
38. Classi Gatto e Canarino public class Gatto { private String nome ; public Gatto(String nome) { this . nome = nome; } public String getNome() { return nome ; } } public class Canarino { private String nome ; public Canarino(String nome) { this . nome = nome; } public String getNome() { return nome ; } }
39. Classe Fattoria public class Fattoria { private Gatto gatto ; private Canarino canarino ; public Gatto getGatto() { return gatto ; } public void setGatto(Gatto gatto) { this . gatto = gatto; } public Canarino getCanarino() { return canarino ; } public void setCanarino(Canarino canarino) { this . canarino = canarino; } public void stampaNomiAnimali() { System. out .println( gatto .getNome()); System. out .println( canarino .getNome()); } }
40. Classe testFattoria public class TestFattoria { public static void main(String[] args) { Gatto gatto = new Gatto( "Silvestro" ); Canarino canarino = new Canarino( "Titti" ); Fattoria fattoria = new Fattoria(); fattoria.setGatto(gatto); fattoria.setCanarino(canarino); fattoria.stampaNomiAnimali(); } }