NFP121, Cnam/Paris
Cours 1
jean-michel Douin, douin au cnam point fr
version : 1 Octobre 2012
Notes de cours
1
NFP121
Plan + Plan prévisionnel
• Introduction à la POO, rappels ?
• Une Classe, aspects impératifs du langage, Exceptions
• Plusieurs classes, Interfaces, Types et Classes, Design Pattern
• Programmation évènementielle
• Interfaces graphiques
• Généricité et Collections
• Design Patterns, structures récursives
• Introspection et réflexivité en Java
• Entrées/Sorties,
• Sérialisation, XML, persistance
• Injection de dépendance
• Programmation Concurrente
• Introduction à la programmation réseau
+• Programmation par Contrat : Java/JML
• Validation des programmes: ESC/Java
• UML2 et le langage OCL
• Méthodes de développement et langage UML
• …
2
NFP121
Plan de l’unité, NFP121 Programmation avancée
• L3 en Licence d’Informatique générale
• Des Cours , des Exercices dirigés, des devoirs hebdomadaires
• Cours 1h30 à 2h + 0h30 à 1h Présentation devoirs
• ED 1h30 centrés sur la réponse aux devoirs et compléments
• Un agenda pour les devoirs
• Un forum d’entraides
• JNEWS un outil d’aide à la réponse attendue
– Le site [Link]
3
NFP121
Horaires et lieux
• Horaires et lieux
– Cours le mardi 18h15/~20h
à l'ENSAM. Amphi Manet, 155 boulevard de l'Hôpital − 75 013
- Compléments ~20h-~21h30
– Séances d'exercices dirigés, en accès libre, les lundis,
au Collège Evariste Galois, 15 rue Montgolfier 75003 ( établissement contigu
au Cnam, 2 rue conté)
Salle 1.11
– Pour le moment deux séances
lundi 18h30 - 20h et 20h - 21h30
– Surveillez [Link]
4
NFP121
Sommaire du cours 1
• Introduction
– Présentation des concepts de l'orienté Objet,
– Java un langage OO : Les objectifs des concepteurs,
• Outil de développement
– BlueJ (>2.5.0) + JDK1.6+
• [Link]
• [Link]
5
NFP121
Principale bibliographie utilisée pour ces notes
• [Grand00]
– Patterns in Java le volume 1
[Link]
• [head First]
– Head first : [Link]
• [DP05]
– L’extension « Design Pattern » de BlueJ : [Link]
– Ou bien en [Link]
• [Liskov]
– Program Development in Java,
Abstraction, Specification, and Object-Oriented Design, [Link] avec J. Guttag
Addison Wesley 2000. ISBN 0-201-65768-6
• [divers]
– Certains diagrammes UML : [Link]
– informations générales [Link]
6
NFP121
Concepts de l'orienté objet
. Un historique …
• Classe et objet (instance d ’une classe)
• État d'un objet et données d ’instance
• Comportement d'un objet et méthodes
– liaison dynamique
• Héritage
• Polymorphisme
– d’inclusion
7
NFP121
Un historique
• Algorithm + Data Structures = Program
– Titre d’un ouvrage de [Link] (Pascal, Modula-2, Oberon)
A+d=P langage de type pascal, années 70
A+D=P langage modulaire, Ada, modula-2, années 80
a+D=P langage Orienté Objet années 90, simula67…
8
NFP121
A+d=P
• surface ( triangle t ) =
• surface ( carré c) =
• surface ( polygone_régulier p) =
• ....
• perimetre ( triangle t ) =
• perimetre ( carré c) =
• perimetre ( polygone_régulier p) =
• .…
• usage : import de la librairie de calcul puis
carré unCarré; // une variable de type carré
y = surface ( unCarré)
9
NFP121
A+D=P
• type carré = structure
• longueurDuCote
• fin_structure;
• >>>-------------------------------------------------------<<<
• surface ( carré c ) =
• perimetre ( carré c ) =
• ………… ( carré c ) =
• usage : import du module carré puis
carré unCarré; // une variable de type carré
y = surface ( unCarré)
10
NFP121
a+D=P
• classe Carré =
• longueurDuCote …
• surface ( ) =
• perimetre ( ) =
• ………… () =
• fin_classe;
• usage : import de la classe carré puis
– carré unCarré; // une instance de la classe Carré
• y = unCarré.surface ( )
11
NFP121
Classe et objet (instance d ’une classe)
class Carré{
Carré
12
NFP121
État d'un objet et données d ’instance
class Carré{
int longueurDuCoté;
longueurDuCoté == 100
longueurDuCoté == 15
longueurDuCoté == 15
longueurDuCoté == 10
13
NFP121
État d'un objet et données d ’instance
class Carré{
int longueurDuCoté;
Couleur couleur;
longueurDuCoté == 100
couleur==vert
longueurDuCoté == 15
couleur==bleu
longueurDuCoté == 15
Couleur==noir
longueurDuCoté == 10
couleur==rouge
14
NFP121
Classe et Encapsulation
class Carré{
private int longueurDuCoté;
private Couleur couleur;
• contrat avec le client
– interface publique, une documentation, le nom des méthodes
– implémentation privée
• Les données d’instances sont privées
15
NFP121
Classe et Encapsulation
class Carré{
private int longueurDuCoté;
private Couleur couleur;
/* par convention d’écriture */
public Couleur getCouleur(){ ….;}
public void setCouleur(Couleur couleur){ …..;}
/* accesseur et mutateur */
/* getter and setter */
16
NFP121
Classe et Encapsulation
class Carré{
private int longueurDuCoté;
private
private Couleur couleur;
// publiques
public couleur getCouleur( …){}
public void setCouleur (…){}
public couleur getCouleur( …){}
Carré public void setCouleur (…){}
???
17
NFP121
Héritage
• Les carrés sont des polygones réguliers
• On le savait déjà …
– Les carrés héritent des propriétés des polygones réguliers
PolygoneRégulier
Carré
– un polygone régulier pourrait être un carré
18
NFP121
Héritage et classification
• Définir une nouvelle classe en ajoutant de nouvelles
fonctionnalités à une classe existante
– ajout de nouvelles fonctions
– ajout de nouvelles données
– redéfinition de certaines propriétés héritées (masquage)
• Une approche de la classification en langage naturel
• Les carrés sont des polygones réguliers (ce serait l ’idéal...)
PolygoneRégulier
Carré
19
NFP121
La classe PolygoneRegulier
class PolygoneRégulier{
private int longueurDuCoté;
private
private Couleur couleur;
/* accesseurs et mutateurs */
/* getter and setter */
/* opérations */
public int surface(){ ….}
20
NFP121
La classe Carré est vide…
class Carré extends PolygoneRégulier{
Carré c … int s = [Link](); surface est héritée
21
NFP121
Héritage, Les Carrés sont des polygones réguliers
PolygoneRégulier
surface();
Carré
p
• PolygoneRégulier p … int s1 = [Link]();
• Carré c … int s = [Link](); surface est héritée
22
NFP121
Héritage et redéfinition (masquage)
PolygoneRégulier
surface();
Carré
surface();
p
• PolygoneRégulier p … int s1 = [Link]();
• Carré c … int s = [Link]();
23
NFP121
La classe Carré, le retour
class Carré extends PolygoneRégulier{
private int longueurDuCoté;
private Couleur couleur;
public int surface(){ ….}
Carré c … int s = [Link](); surface est redéfinie
24
NFP121
Comportement d'un objet et méthodes
PolygoneRégulier Carré
surface();
surface();
• PolygoneRégulier p = c;
• [Link](); ??? surface(); ou surface(); ???
25
NFP121
Liaison dynamique
• PolygoneRégulier p = c;
• [Link](); ??? surface(); ou surface(); ???
• Hypothèses
1) La classe Carré hérite de la classe PolygoneRégulier
2) La méthode surface est redéfinie dans la classe Carré
• PolygoneRégulier p = c;
– p doit se comporter comme un Carré
PolygoneRégulier p1 = … un pentagone ;
• p = p1 Possible ??? [Link]() ???
26
NFP121
Démonstration
• BlueJ
– [Link]
– Outil avec tests unitaires intégrés
27
NFP121
Démonstration, discussion
• Tests unitaires en vert
28
NFP121
Les carrés sont des polygones, attention
Carré
PolygoneRégulier
• Un extrait du cahier des charges
– Les carrés sont verts
– Les polygones réguliers sont rouges
29
NFP121
Les carrés sont des polygones, attention
Carré
• ? Couleur d’un PolygoneRegulier de 4 côtés ?
– Discussion :
• Serait-ce une incohérence du cahier des charges ?
• Ou bien un polygone régulier de 4 côtés ne devrait-il pas muter en
carré ?
• …
30
NFP121
La plupart des langages à Objets, y compris Java…
PolygoneRégulier
couleur();
Carré
couleur();
c
• Alors en java
• Un PolygoneRégulier de 4 côtés est rouge
• Un Carré est vert
– …
31
NFP121
La suite
• Discussion
• Polymorphisme de plus près
• Liaison dynamique
– récréation
32
NFP121
Polymorphisme : définitions
• Polymorphisme ad'hoc
– Surcharge( overloading),
– plusieurs implémentations d'une méthode en fonction des types de paramètres
souhaités, le choix de la méthode est résolu statiquement dès la compilation
• Polymorphisme d'inclusion
– Redéfinition, masquage (overridding),
– est fondé sur la relation d'ordre partiel entre les types, relation induite par l'héritage. si
le type B est inférieur selon cette relation au type A alors on peut passer un objet de
type B à une méthode qui attend un paramètre de type A, le choix de la méthode est
résolu dynamiquement en fonction du type de l'objet receveur
• Polymorphisme paramétrique ou généricité,
– consiste à définir un modèle de procédure, ensuite incarné ou instancié avec différents
types, ce choix est résolu statiquement
– extrait de M Baudouin-Lafon. La Programmation Orientée Objet. ed. Armand Colin
33
NFP121
Polymorphisme ad'hoc
• 3+2 3.0 + 2.5 "bon" + "jour"
• [Link](5); [Link](5.5); [Link]("bonjour");
– le choix de la méthode est résolu statiquement à la compilation
– print(int) print(double) print(String)
34
NFP121
Polymorphisme d'inclusion
• A a = new A(); a.p(); Classe A
• B b = new B(); b.p(); méthode p()
• a = new B(); a.p();
hérite
Classe B
void m(A a){ méthode p()
a.p();
}
m(new B());
m(new A());
– B hérite de A, B est inférieur selon cette relation au type A
– le choix de la méthode est résolu dynamiquement en fonction du type
de l'objet receveur
35
NFP121
Polymorphisme paramétrique
• Une liste homogène
• class Liste<T>{
void add(T t) …
void remove(T t) …
…
}
Liste<Integer> li = new Liste<Integer>();
[Link](new Integer(4));
Liste<A> la = new Liste<A>();
[Link](new A());
[Link](new B()); // B hérite de A
– incarné ou instancié avec différents types, ce choix est résolu statiquement
36
NFP121
Affectation polymorphe
• Création d'instances
– Carre c1 = new Carre(100);
– Carre c2 = new Carre(10);
– PolygoneRegulier p1 = new PolygoneRegulier(4,100);
• Affectation
– c1 = c2; // synonymie : c1 est un autre nom pour c2
// c1 et c2 désignent le même carré de longueur 10
• Affectation polymorphe
– p1 = c1;
• Affectation et changement de classe
– c1 = (Carre) p1; // Hum, Hum ... Hasardeux, levée d’exception possible
• if (p1 instanceof Carre) c1 = (Carre)p1; // mieux, beaucoup mieux …
37
NFP121
Liaison dynamique
• Sélection de la méthode en fonction de l'objet receveur
• déclaré / constaté à l'exécution
• PolygoneRegulier p1 = new PolygoneRegulier(5,100);
// p1 déclarée PolygoneRegulier
• Carre c1 = new Carre(100);
• int s = [Link](); // p1 constatée PolygoneRegulier
• p1 = c1; // affectation polymorphe
• s = [Link](); // p1 constatée Carre
• Note importante : la recherche de la méthode s'effectue uniquement dans l'ensemble des
méthodes masquées associé à la classe dérivée
– Rappel : Dans une classe dérivée, la méthode est masquée seulement si elle possède exactement la même signature
38
NFP121
Selon Liskov cf. Sidebar2.4, page 27
• The apparent type of a variable is the type understood by the
compiler from information available in declarations. The
actual type of an Object is its real type -> the type it receives
when it is created.
Ces notes de cours utilisent
• type déclaré pour apparent type et
• type constaté pour actual type
39
NFP121
Java un langage à Objets
• Sommaire
– Généralités
– Démonstration
– Une classe
• Tests unitaires
40
NFP121
Java : les objectifs
• « Simple »
– syntaxe " C «
• « sûr »
– pas de pointeurs, vérification du code à l ’exécution et des accès réseau et/ou fichiers
• Orienté Objet
– (et seulement !), pas de variables ni de fonctions globales, types primitifs et objet
• Robuste
– ramasse miettes, fortement typé, gestion des exceptions
• Indépendant d ’une architecture
– Portabilité assurée par la présence d ’un interpréteur de bytecode sur chaque machine
• Environnement riche
– Classes pour l ’accès Internet
– classes standard complètes
– fonctions graphiques évoluées
• Technologie « Transversale »
41
NFP121
Simple : syntaxe apparentée C,C++
public class Num{
public static int max( int x, int y){
int max = y;
if(x > y){
max = x;
}
return max;
}
}
Fichier [Link]
Note : C# apparenté Java
42
NFP121
Sûr par l ’absence de pointeurs (accessibles au programmeur)
• Deux types : primitif ou Object (et tous ses dérivés)
• primitif :
– int x = 1;
– int y = 2; z 3
– int z = 3; y 2
x 1
• Object
– Object o = new Object(); Données
– Object o1 = new Object(); pour o1
o1
– Object o1 = o; o Données
pour o
43
NFP121
Sûr par l ’absence de pointeurs, attention à la sémantique du =
• Deux types : primitif ou Object (et tous ses dérivés)
• primitif :
– int x = 1;
– int y = 2;
z 1
– int z = 3;
y 2
– z = x; x 1
Données
• Object pour o1
– Object o = new Object();
– Object o1 = new Object(); o1
o Données
– o1 = o;
pour o
44
NFP121
Robuste
• Ramasse miettes ou gestionnaire de la mémoire
– Contrairement à l’allocation des objets, leur dé-allocation n’est pas à
la charge du programmeur
• Ces dé-allocations interviennent selon la stratégie du gestionnaire
• Fortement typé
– Pas d’erreur à l’exécution due à une erreur de type
– Mais un changement de type hasardeux est toujours possible…
• Généricité
– Vérification statique, à la compilation, du bon « typage »
• Exceptions
– Mécanisme de traitements des erreurs,
– Une application ne devrait pas s’arrêter à la suite d’une erreur,
• (ou toutes les erreurs possibles devraient être prises en compte …)
45
NFP121
Portable
public class Num {
•
Le source Java …
[Link]
}
1) compilation
1100 1010 1111 1110 1011 1010 1011 1110
• fichier compilé
Le 0000 0011 0001 1101 …………………...
[Link]
Lecture locale ou distante du fichier
jvm jvm jvm
sun mac pc
2) interprétation
/ exécution
Sun Mac pc
solaris MacOS Windows
46
NFP121
Environnement (très) riche
• [Link]
• [Link]
• [Link]
• [Link]
• [Link]
• [Link]
• [Link]
• [Link]
• [Link]
• [Link]
• [Link]
• [Link]
• [Link]
• [Link]
• [Link]
• [Link]
• Liste des principaux paquetages de la plate-forme JDK 1.2
soit environ 1500 classes !!! Et bien d ’autres A.P.I. JSDK, JINI, ...
• le JDK1.3/1850 classes,
• Le JDK1.5 ou j2SE5.0 3260 classes
• Le J2SE 1.6 …. 47
NFP121
Technologie « Transversale »
Source : [Link] 48
NFP121
Pause … enfin presque
• Quelques « rappels » de Syntaxe
– En direct
• Démonstration
– BlueJ
• Présentation de JNEWS
– Un outil d’aide à la réponse attendue développé au Cnam
49
NFP121
Un exemple en Java : la classe Carre
public class Carre extends PolygoneRegulier{
private int longueurDuCote;
public void initialiser(int longueur){
longueurDuCote = longueur;
}
public int surface(){
return longueurDuCote * longueurDuCote;
}
public int perimetre(){
return 4*longueurDuCote;
}
// un usage de cette classe
Carre unCarre = new Carre(); 100
[Link](100); unCarre
int y = [Link](); 50
NFP121
Liskov suite [Sidebar2.4,page 27]
• Hiérarchie
• Java supports type hierarchy, in which one type can be the
supertype of other types, which are its subtypes. A
subtype ’s objects have all the methods defined by the
supertype.
• Object la racine de toute classe
• All objects type are subtypes of Object, which is the top of the
type hierarchy. Object defines a number of methods,
including equals and toString. Every object is guaranteed to
have these methods.
51
NFP121
Démonstration
• Outil Bluej
– La classe Carré
– Instances inspectées
• Tests Unitaires
– La Classe CarréTest
• Ou la mise en place d’assertions pertinentes
• En assurant ainsi des tests de non régression,
– « vérifier » que le système ne se dégrade pas à chaque modification…
• Augmenter le taux de confiance envers le code de cette classe …
– Très informel, et comment obtenir des tests pertinents ?
• Tests Unitaires « référents » : Outil JNEWS
– Java New Evaluation Web System
52
NFP121
Demo : Bluej
• Instances et leur inspection
53
NFP121
Demo : Bluej + tests unitaires
• Test unitaires depuis BlueJ ou en source
54
NFP121
Tests unitaires : outil junit intégré
• [Link]
• [Link]
• Un exemple :
public class CarreTest extends [Link]{
public void testDuPerimetre(){
Carre c = new Carre();
[Link](10);
assertEquals(" périmètre incorrect ???" ,40, [Link]());
}
}
55
NFP121
Assertions
assertEquals(attendu, effectif);
assertEquals(" un commentaire ???" ,attendu, effectif);
assertSame(" un commentaire ???" ,attendu, effectif);
assertTrue(" un commentaire ???" ,expression booléenne);
assertFalse(" un commentaire ???" , expression booléenne);
assertNotNull(" un commentaire ???" , une référence);
…
Le commentaire est affiché lorsque l’assertion échoue
56
NFP121
JNEWS contient des Tests unitaires distants
• Tests unitaires distants et référents (ce qui est attendu…)
internet 57
NFP121
JNEWS : outil Submitter… intégré
• Un clic suffit
58
NFP121
Demonstration : JNEWS une réponse : Bravo!!
59
NFP121
JNEWS au Cnam
– Une aide à la réponse attendue
– +
– Outils en ligne comme PMD , findbugs , checkstyle,…
– +
– Remise planifiée d’un rapport de TP et des sources correctement
documentées
• [Link]
60
NFP121
Conclusion
61
NFP121
Annexe
• c.f. [Link]
62
NFP121