Amphi 7

publicité
Le paysage de Java
Programmation objet avancée
Amphi 7
Thomas Nowak
Université Paris-Sud
Au programme
•
APIs de Java
•
d’autres langages orientés objet
•
d'autres langages sur la JVM
•
conclusion
APIs de Java
•
Échanges de données : JAXB, org.json
•
Bases de données : JDBC, Hibernate
•
GUI : Swing, JavaFX
•
Web : EJB, Spring
•
Mobile : Android
•
Streams : expressions lambda
Échanges de données :
XML et JSON
•
XML : format hiérarchique de données, inspiré de
HTML
•
initialement le format utilisé pour des requêtes AJAX
(Asynchronous JavaScript And XML)
•
ex :
<?xml version="1.0" encoding="UTF-8"?>
<personne id="100">
<age>23</age>
<nom>Toto</nom>
</personne>
Échanges de données :
XML et JSON
•
une des librairies XML en Java : JAXB
•
peut transformer un fichier XML directement en
objet qu’il décrit et vice versa
•
avec ça l’utilisation de XML comme format de
stockage est transparent à l’utilisateur de JAXB
•
il faut annoter les données à stocker dans la classe
Échanges de données :
XML et JSON
@XmlRootElement
public class Personne {
@XmlElement
String nom;
@XmlElement
int age;
@XmlElement
int id;
. . .
}
Échanges de données :
XML et JSON
File file = new File("pers.xml");
JAXBContext jaxbContext =
JAXBContext.newInstance(Personne.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Personne pers = (Personne) jaxbUnmarshaller.unmarshal(file);
Échanges de données :
XML et JSON
•
un format plus utilisé : JSON
•
collection de couples key/value
•
ex:
{"id": 100, "nom": "Toto", "age": 23}
•
peut être converti en objet aussi : librairie Jackson
Bases de données
•
JDBC pour se connecter et lancer des requêtes SQL
•
ex :
ResultSet rs = stmt.executeQuery( "SELECT * FROM MyTable" )
•
JDBC pour se connecter et lancer des requêtes SQL
•
convertir des objets Java avec la librairie Hibernate
GUI : Swing et JavaFX
•
Swing : JFrame, JPanel, JButton, etc.
•
MVC
•
callbacks pour les événements
•
JavaFX : nouvelle librairie destinée à remplacer Swing,
dans Java SE depuis Java 8
•
similaire à Swing, quelques améliorations, e.g.,
possibilité d’utiliser CSS et de décrire le layout statique
dans un fichier XML
Web : EJB et Spring
•
plusieurs framework pour les serveur web
•
Enterprise JavaBeans (EJB) et Spring les plus
populaires
•
incluent la gestion de threads, connexions réseau,
BD, transactions, MVC, testing
Android
•
applications Android tournent dans une JVM sur le
téléphone ou la tablette
•
informations de base dans un fichier “manifeste”
XML
•
le layout d’un écran peut être statiquement décrit
dans un fichier XML
•
sinon développement GUI “normal” (MVC,
listeners, etc.)
Expressions lambda
•
fonctions anonymes
•
ex : x -> x+42
•
spécification des types possible mais pas
nécessaire s’ils peuvent être inférés
•
peut décrire une instance de chaque interface
avec une seule méthode
Expressions lambda
•
Ex : ActionListener
Expressions lambda
•
peut contenir des effets de bord :
button.addActionListener(e ->
System.out.println("Lambda"));
•
pareil pour Runnable ou Callable :
executor.submit(() -> 42)
•
facilite un style de programmation fonctionnel
(map, reduce, filter)
Langages orientés objet
•
Java
•
C++
•
JavaScript
•
Python
•
etc : C#, Objective-C, Swift, …
C++
•
comme Java : orienté objet, statiquement typé
•
sur-ensemble de C, peut donc utiliser toutes les
librairies C
•
pas de garbage collection
•
choix de passage de paramètres par valeur,
référence ou pointeur
•
différence du point de vue POO : héritage multiple
C++
•
changé considérablement avec les nouveaux standards C++11
et C++14
•
ex : inférence de type
auto x = 3.7;
•
ex : boucles foreach
for(int &x : vec) x = 2*x;
•
ex : smart pointers
shared_ptr<Object> p1 = make_shared<Object>(“foo");
•
ex : expressions lambda
JavaScript
•
malgré le nom, n’a rien à voir avec Java
•
nom officiel du standard : ECMAScript
•
normalement interprété par le navigateur
•
des interpréteurs standalone existent aussi (par
exemple pour exécuter node.js)
•
dynamiquement typé
•
pas de classes, mais des prototypes
JavaScript
var foo = {one: 1, two: 2};
// bar.[[prototype]] = foo
var bar = Object.create( foo );
bar.three = 3;
bar.one; // 1
bar.two; // 2
bar.three; // 3
Python
•
langage orienté objet avec des classes
•
focus sur brévité et lisibilité
•
programmation fonctionnelle possible
•
REPL
Python
class Rectangle:
def __init__(self, x, y):
self.x = x
self.y = y
def area(self):
return self.x * self.y
Langages sur la JVM
•
Java (duh)
•
Scala
•
Jython, JRuby
•
Clojure
Java Virtual Machine
•
machine virtuelle à pile d’opérandes
•
objets créés sur le tas
•
garbage collection pour le tas
•
fichiers .java sont compilés en fichiers .class
•
fichiers .class contiennent le Java bytecode que
la JVM exécute
Java Virtual Machine
•
8 types numériques et 3 types de références (array,
class, interface)
•
chaque appel à une méthode crée un stack frame
avec les paramètres, les variables locales et la pile
d’opérandes
•
types vérifiés statiquement
•
depuis Java 7 : appels dynamiques
Java Virtual Machine
•
il est donc possible de générer du Java bytecode
pour d’autres langages
•
avec l’ajout d’appels dynamiques même une plus
grande classe de langages potentiels
•
intérêt : interaction avec toute l’API de Java,
machine virtuelle très utilisée et stable
Langages sur la JVM
•
Scala : orienté objet, statiquement typé, proche de
Java, des aspects fonctionnels
•
Jython, JRuby : implémentations de Python et Ruby
sur la JVM
•
Clojure : purement fonctionnel, dialecte de Lisp
Clojure
•
réutilise les types numériques (+ Ratio) et strings
de Java
•
3 types de collections de base pour construire des
structures de données : listes (et vecteurs),
tableaux associatifs (key/value) et ensembles
•
dynamiquement typé : pas besoin de déclarer le
type d’une valeur
•
toutes les données sont immuables
Clojure
•
langage fonctionnel : les fonctions peuvent prendre
en paramètre d’autres fonction et aussi retourner
des fonctions
•
user=> (map inc '(1 2 3))
(2 3 4)
•
user=> (filter even? '(1 2 3 4))
(2 4)
Clojure
•
presque tout code en Clojure est thread-safe par
définition
•
commence à être beaucoup utilisé pour des
programmes concurrents
•
en particulier pour la programmation web :
ClojureScript qui compile Clojure à JavaScript
•
développement avec une REPL
Conclusion
•
point fondamental de la POO : héritage
•
aspect “structure de données” d’objets : rajouter des
champs
•
aspect comportemental d’objets : rajouter ou changer des
méthodes ; attention à la cohérence du sous-type avec
toutes les utilisations du sur-type (“Socrate est mortel”)
•
POO est très utilisée dans la pratique, y compris des
applications concurrentes : attention à la synchronisation
de l’accès
Téléchargement