1 Définition dune classe en Java
par et pour la réutilisation. Programmation par classes en Java. Notes de cours. Christophe Dony. 1 Définition d'une classe en Java. 1.1 Rappel.
1 Programme 2 Réutilisation
Listing (7) – Exemple en Java les méthode f1 et f2 de la classe A sont Définition d'une méthode de nom M sur une sous-classe SC d'une classe C.
Ingénierie Logicielle - Concepts et Outils de la Modélisation et du
Figure (1) – Un élément logiciel (vue d'artiste - 4vector.com) Listing (7) – Exemple en Java les méthode f1 et f2 de la classe A sont.
Objets Avancés Vue générale de Smalltalk : Tout Objet
Listing (1) – définition de la méthode fact sur la classe PositiveInteger. 1 normal CompiledMethod numArgs=0 son des syntaxes Java et Smalltalk.
1 Définitions 2 Mod`ele de composant et dassemblage 3 Utilisations
Un java-beans est soit un objet sérialisé pouvant être cloné soit une classe pouvant être instanciée. Un java-beans peut être un objet minimal ou un composite
1 Introduction
Variables d'instance variables de classes (équivalent des “statiques” de C++ et Java)
1 Introduction
Redéfinir new sur chaque classe de classe Singleton : 1 L'idée liée `a celle d'interface (`a la Java) alternative autorisant la définition de méthodes ...
Les objets en Java Plan Types et Classes Exemple 1: fraction
Définition en Java public class Fraction { int numerateur; int denominateur;. } • On ne se préoccupe pas pour l'instant des problèmes de réductibilité.
1 Programme 2 Réutilisation - Evolution
Par exemple version Java
Cours de base dIngéniérie des applications objet. Polymorphisme
Définition en JAVA (mot-clé extends). Exemple : Point3D sous-classe de Point. class Point3D extends Point { private double z;
Universite Montpellier-II
UFR des Sciences - Departement Informatique
Objets Avances
Vue generale de Smalltalk :
Tout Objet, Environnement de Genie Logiciel, Re
exivite,Metaprogrammation, IDM,
Notes de cours - 2007-2021
Christophe Dony1
1 Introduction
Smalltalk est a la fois (i) un langage premier sur dierents aspects du genie logiciel dont l'adaptabilite dynamique des programmes et la pratique \agile", (ii) un modele d'evolution pour les autres langages de par la simplicite de ses concepts et, (iii) avec Simula, un des deux langages historiques a l'origine de l'approche Objet. Ce sont trois raisons pour l'etudier. 21.1 Idees cle
1. S implicite,Uniformit e(4 grands fondemen tsdon t\tout est ob jet",v oirsection 1.3 2. Lan gagede programmation ET En vironnementin teractifde g enielogiciel d edieau developpement \agile" ( )Figure(1) {Ce cours utilise le langage et environnement Pharo, une emanation actuelle de Smalltalk - https ://pharo.org/ 3. In genierieDirig eepar les Mo deles,mo deles al'ex ecution,ad aptabilitedynamique des programmes ... ("L'intelligence c'est la faculte de s'adapter au changement."StephenHawking).
31.2 Quelques liens historiques et pratiques
Alan Kay (https://fr.wikipedia.org/wiki/Alan_Kay), createur du langage, medailleTuring
Histoire, l'idee de base :https://fr.wikipedia.org/wiki/Dynabook Histoire, les livres :http://www.world.st/learn/booksLa machine virtuelle pour le tout objet re
exif : CoG de Eliot Miranda (http://www. mirandabanda.org/cogblog/about-cog/) Le centre d'information Europeen :http://www.esug.org/ Le langage utilise utilise dans ces notes :http://pharo.org/(Pharo is a clean, inno- vative, open-source Smalltalk-inspired environment) Un cours interactif en ligne :http://mooc.pharo.org, http://stephane.ducasse.free.fr/FreeBooks.html: catalogue de livres sur Small- talk dont certains en ligne www.squeak.org: Squeak est un Smalltalk gratuit realise par une equipe dirigee parAlan Kay
les versions industrielles :http://www.cincomsmalltalk.com/main/: Cincom, Small- talk industriel (ObjectStudio - Visualworks) 4POURQUOI c'est interessant :
Simplicite :http://stackoverflow.com/questions/1821266/what-is-so-special-about-smalltalk Adaptabilite Dynamique, Ingenierie dirigee par les modeles :http://moosetechnology.org/ Agilite :https://en.wikipedia.org/wiki/Extreme_programming. site de Kent Beck, fonda- teur de \Agile development" :http://www.threeriversinstitute.org: Innovation :https://blog.appacademy.io/pharo-future-software-development/ 51.3 Le style de langage
heritier deSimula(Objet, abstraction de donnees, polymorphisme d'inclusion) heritier deLisp-Scheme style applicatif (toute instruction est une expression), ordre superieur typage dynamique (pas de problemes de redenitions covariantes, pas de surcharge statique), passage par reference (a laLisp)generalise, allocation et recuperaration dynamiques et automatiques de la memoire, compilation en instructions d'une machine virtuelle, re exivite : Programmes et Environnement = donnees, 6Le langage en quatre idees
1.T outeen titeest u nob jet.
Un objet est une entite individuelle, reperee par une adresse unique, possedant un ensemble de champs (autant que d'attributs sur la classe), connus par leurs noms et contenant une valeur qui peut changer (mutable). 2.T outob jetest instance d'une classe ,
qui denit sa structure (denie par un ensemble attributs prives) et ses comportements (denis par un ensemble de methodes). 3. T outcomp ortementd'un ob jet(m ethode)est activ epar u nen voide mess age(a vec liaison dynamique). 4. T outeclasse (sauf ProtoObject) est denie comme une specialisation d'une autre. La relation de specialisation denit un arbre d'heritage. 71.4 Interpretation, Compilation, machine virtuelle
Principe d'execution : compilation des instructions enbyteCodesou instructions d'une ma- chine virtuelle dediee a la programmation par objets, puis interpretation de ces instructions. Machine virtuelle Smalltalk : ensemble d'instructions dediees a la programmation par objets et interpreteur associe.Javaa repris ce schema d'execution. Voir par exemple COG (http: 8Exemple de methode et de bytecode genere
1fact2^self= 03ifTrue:[1]4ifFalse:[self?(self-1)fact]Listing (1) {denition de la methodefactsur la classePositiveInteger1normalCompil edMethodnumArgs =0numTemps=0frameSize=122literals: (#fact)31<44>pushself 42<49>push053send=64jumptrue 1376<44>pushself 87<44>pushself 98<4A>push1109send-1110<70>sendfact 1211send?1312<66>pop1413<60>pushself ;return9
1.5 Introduction pratique
Classes et instances2Objectsubclass: #Compteur3instanceVariableNames:' valeur'4classVariableNames:' '5poolDictionaries:' '6category:' ExosPharo-PetitsExercices'8initialize9valeur: = 0.10get11^valeur12incr13valeur: =valeur+ 1.14decr15valeur: =valeur-1.Listing (2) {classeCompteur, denition de classe et de methodes d'instance
102new3"redenitiond ela m ethodenew p ourapp elerautomatiquement une m ethoded'initialization"
4^supernew initialize 6example7jcj8c: =Compteurnew .9cincr .10^cListing (3) {denition de methodes de classe
111.6 La classe Compteur dans l'environnement
Figure(2) {Denition de la classeCompteur-PharoEnv. 121.7 L'exception universelle :doesNotUnderstand13.4factorial!Instance of SmallFloat64 did not undestrand factorial
Conduite a tenir :
lire le message si non comprehension, ouvrir le debbugger (one click), corriger, relancer 131.8 Tout objet et re
exivite11class"->SmallInteger"21classclass "->SmallIntegerclass "31classclass class "->Metaclass"41classclass class class "->Metaclassclass "51classclass class class class "->Metaclass"15factorial"->120"2m: =IntegercompiledMethodAt: #factorial.3mclass "->CompiledMethod"4mname "->'Integer>>#factorial"5mvalueWithReceiver: 5arguments:#()"->120"1factorial2^self= 03ifTrue: [thisContextinspect .41]5ifFalse: [self?(self-1)fact]14
2 Syntaxe
exampleWithNumber: x A metho d that il lustrates every p art ofSmal ltalk
metho d syntax exc ept primitives It has unary binary and keyb oard messages de clares ar guments and temp oraries ac cesses a glob al variable but not an instanc e variable uses liter als array char acter symb ol string inte ger o at uses the pseudo variables true false nil self and sup er and has se quence assignment return and c ascade It has b oth ze ro ar gument and one ar gument blo cksjyjtrue&falsenot & (nilisNil )ifFalse:[selfhalt ].y: =selfsize +supersize .#(n$a#a"a"1 1.0)do:[:eachjTranscriptshow: (eachclass name );show:' ' ].^x Manipulables dans le texte des programmes via leur symbole eponyme.IntegermethodDictionary at: #factorialNon types dans le texte des programmes (typage dynamique). ^33"return33 "Toute invocation de methode rend une valeur, celle deselfpar defaut, le typevoidn'existe La boucle for utilise unblocka un parametre qui tient lieu de compteur de boucle1to:20do:[:ijTranscriptshow: i printSting ].25 aDatenew .Datetoday .a. Les methodes de classe sont en fait des methodes d'instance denies sur les metaclasses, voir la section . En premiere approche, elles ressemblent auxstaticenC++puisJava, mais elles sont en fait des methodes de SC possede les caracteristiques denies par C.Figure(6) {Varietes de polymorphismes (extrait de Luca Cardelli, Peter We- (voir cours \Reutilisation/Frameworks").1indexOf:anElementstartingAt :startifAbsent :exceptionBlock2"Answerthe index of the first occurence of anElement after start Untrait, a distinguer d'une interface, denit des methodes abstraites ou concretes.1Traitnamed: #TComparable2uses:fg3package:' Kernel-Traits'!5 Un trait denir des attributs (resultat recent -stateful traitsa)a. Pablo Tesone, Stephane Ducasse, Guillermo Polito, Luc Fabresse, Noury Bouraqadi,A new modular l'utiliser.1c: =OrderedCollectionn ew.2cadd: 1;add:19;add:8;add:11.3csort ->anOrderedCollec tion(1 8 11 19)4cisKindOf: TSortable ->falseListing (10) {Utilisation de la methodesortdu traitTSortablepour une en particulier lui envoyer des messages.15factorial"entier"2'abcde'at: 3"cha^nede c aractere"3#($a$b)reverse"tableau"4trueifTrue: [#ofCourse]"booleen''5falseifFtrue: [# useless]6nilisNil " nullpointer or UndefinedObject ''7selecteur: = #facto, #rial``concatenationde symboles ''Un type primitif est represente par une classe mais son implantation n'est pas entierement2.1 Constantes litterales
\Constantes" car leur valeur ne peut ^etre modiee et \litterales" car elles peuvent ^etre entrees litteralement dans le texte des programmes. nombres : 3, 3.45, -3, caracteres :$a,$M,$$ chaines : 'abc', 'the smalltalk system' symboles : #bill, #a22 booleens : true, false tableaux de constantes litterales (construit a l'analyse syntaxique) : #(3 3.45 -3aM 'abc' #bill true #(am stram gram)) commentaires : "ce commentaire sera ignore par l'analyseur syntaxique" 16 2.2 Identicateur
Suite de chires et lettres commencant par une lettre. 2.3 Aectation
i : = 3Listing (5) {a laAlgol, ou a laPascal 2.4 Sequence d'Instructions
Il y a une sequence implicite associee a tout bloc (corps de methode par exemple). Dans un bloc, Les instructions sont separees par un \." (et pas un \;").uneMethode i : = 1.j: = 2.2.5 Tableaux litteraux a : = 3.fa.a+1 .a?ag"-->#(34 9) 18 2.6 Retour a l'appelant
2.7 Envoi de message
Denitions :
Conceptuelle : demande a un objet d'executer un de ses comportements implante sous la forme d'une methode. Operationnelle : appel de methode avec selection de la methode a executer selon le type dynamique du premier argument, qualie de receveur et syntaxiquement distingue. 20 Trois sortes de messages (distinction syntaxique) : 1.unaires(a un seul argument : le receveur)
1 class
5 fact
2.binaires(a deux arguments, syntaxe pratique pour les operations arithmetiques en
inxe) 1 + 2 21
3.\keywords"(an(n >= 2) arguments dont le receveur)
Leur forme syntaxique (originale) permet de representer un envoi de message comme une \petite conversation" (small talken anglais) entre un objet et un autre. 1 log: 10
anArray at: 2 put: 3 monCalendrier enregistre: unEvenement le: unJour a: uneheure Les familiers deJavatraduiront en :
monCalendrier.enregistre(unEvenement, unJour, uneHeure) Noms des methodes utilisees dans ces exemples :
log:, at:put:, enregistre:le:a:. 22
Precedence :
unaire>binaire>keyword, exemple :1 + 5 factegale 121 et pas 720. Associativite : A precedence egale les messages sont composes de gauche a droite. exemple : 2 + 3 * 5 = 25
2 + (3 * 5) = 17
Cascade de messages :
r s1; s2; s3.est equivalent a :r s1. r s2. r s3. 23
2.8 Structures de contr^ole
Il n'existe aucune forme syntaxique particuliere pour les structures de contr^ole; le contr^ole se realise par envois de messages. Le propre d'une structure de contr^ole est d'avoir une politique non systematique d'evaluation de ses arguments. Implanter des structures de contr^ole comme des methodes standard necessite donc que les arguments de ces methodes ne soient pas evalues systematiquement au moment de l'appel. La solution Smalltalk a ce probleme consiste a utiliser desblocks (fermetures lexicales), soit en position de receveur, soit en position d'argument. Une fermeture lexicale est une fonction anonyme (lambda-expression) capturant son envi- ronnement lexical de denition (toute variable libre y est interpretee relativement a l'envi- ronnement dans lequel la fermeture a ete denie). La syntaxe de denition d'une fermeture est[
2.8.1 Exemples
Conditionnelle(aNumbernn2) = 0ifTrue:[parity: = 0]ifFalse:[parity: = 1]Boucle \For" Iterateur generalise
untableau : = #(3 5 7 9).untableaudo: [:eachjTranscriptshow: each ;cr]Formes de gestion d'exceptions untableau findKey: x ifAbsent: [0]26 3 Pratique basique du langage
3.1 Classes et Methodes
Toute classe est creee comme sous-classe d'une autre classe. Variables d'instance, variables de classes (equivalent des \statiques" de C++ et Java), variables depool. 27
Figure(3) {Denition de la classeTimeSpan-Pharoenv. 28
Methodes d'instance
Figure(4) {Methode d'instance \=" de la classeTimeSpan 29
Methodes de classe
Methodes invocables par envoi de message aux classes
Figure(5) {Methode de classe \today" de la classe Date (En fait une methode d'instance de la (meta)-classe \Date class") 31
Dierentes sortes de variables accessibles au sein des methodes Les identicateurs accessibles au sein d'une methode M : les parametres de M, les variables temporaires de M, les attributs (variables d'instance) declares sur la classe du receveur courant, les identicateurs predenisself,super,true,false,nil. les variables de classe de la classe C de O (celle ou est denie M) les variables partagees entre la classe C et d'autres classes (voirPoolDictionary), les variables globales du systeme, dont celles referencant toutes les classes. 32
3.2 Envoi de message
Demande a un objet d'executer un de ses services.
Procede, realise a l'execution, menant a l'execution d'un methode de m^eme nom que le selecteur. Consiste en la recherche de la methode dans la classe du receveur du message puis en cas d'echec dans ses superclasses. Diverses techniques d'optimisation de l'envoi de messages sont implantees dans les diverses machines virtuelles dont la premiere est la technique de cache (voir legreen book). 33
3.3 Instantiation et initialisation des objets
On instancie une classe en lui envoyant le messagenew. newest une methode denie sur une superclasse commune a toutes les metaclasses (cf. metaclasses). newrealise l'allocation memoire et rend la reference sur le nouvel objet. Exemple :Date new,d := Date new.
Il n'y a pas de constructeurs speciques;
l'initialisation s'eectue via des methodes standard, souvent invoquees automatiquement dans des redenitions de la methode de classenew. Exemples : voir les methodesnewetx:y:de la classe Point. 34
3.4 Exemple
1Objectsubclass: #Compteur2instanceVariableNames:' valeur'3classVariableNames:' '4poolDictionaries:' '5category:' Compteur-MVC'7!CompteurmethodsFor :' acceslec ture/ecriture'!8nombreUnites9^valeur11nombreUnites:n 12valeur: =n.14!CompteurmethodsFor :' imprimer'!16printOn:aStream 17aStreamnextPut: $@.18selfnombreUnites print On:a Stream35
1!CompteurmethodsFor :' operations'!3decr4selfnombreUnites :val eur-16incr7selfnombreUnites :val eur+ 19raz10selfnombreUnites :011"---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!13Compteurclass 14instanceVariableNames:' '16!Compteurclass methodsFo r:' creation'!17new18^supernew raz 36
3.5 Classe abstraite
Une classe ne peut ^etre declaree abstraite mais elle peut ^etre rendue abstraite par le pro- grammeur en redenissant la methodenewpour signaler une exception. Ceci pose neanmoins de serieux problemes pour ses futures sous-classes concretes. (uti- lisation obligatoire debasicNew). Ceci est une limite de la solution Smalltalk pour les metaclasses (voir section 4.3 3.6 Methode abstraite
Une methode ne peut ^etre declaree abstraite mais elle peut ^etre rendue abstraite en la denissant de la facon suivante :method self subclassResponsibility 37
3.7 Polymorphisme d'inclusion, Heritage entre classes
Creer une sous-classe SC d'une classe C, revient a denir un sous-type, au sens du polymorphisme d'inclusion du type denit par C. Ainsi, SC herite de C et toute instance Comput. Surv. 17(4) : 471-522 (1985)
38
Heritage simple : toute methode denie sur une surclasse est applicable (via envoi de message) aux instances des sous-classes. Regle de redenition/specialisation: toute methode de nom m d'une sous-classe SC d'une classe C denissant m en est une redenition. de plus : pas de regles de covariante/contravariance, pas dedowncast, pas de surcharge, polymorphisme parametrique universel mais sans contr^ole du compilateur, avantages et defauts a correler a la pratique de tests systematiques et elabores? (Plus globalement voirAgile Development, ou la classeTestCaseenPharo). 39
41
3.8 Un exemple de hierarchie : Les collections
1ProtoObject#()2Object#()4Collection#()5Bag#('contents')6IdentityBag#()7CharacterSet#('map')8SequenceableCollection#()9ArrayedCollection#()10Array#()11ActionSequence#()12DependentsArray#()13WeakActionSequence#()14WeakArray#()15Array2D#('width' 'contents')16B3DPrimitiveVertexArray#()17Bitmap#()18Heap#('array' 'tally' 'sortBlock')19Interval#('start' 'stop' 'step')20TextLineInterval#('internalSpaces' 'paddingWidth' 'lineHeight' 'baseline')21LinkedList#('firstLink' 'lastLink')22Semaphore#('excessSignals')23MappedCollection#('domain' 'map')24OrderedCollection#('array' 'firstIndex' 'lastIndex')25GraphicSymbol#()26SortedCollection#('sortBlock')27UrlArgumentList#()28SourceFileArray#()29StandardSourceFileArray#('files')30Set#('tally' 'array')31Dictionary#()32HtmlAttributes#()33IdentityDictionary#()34SystemDictionary#('cachedClassNames')35Environment#('envtName' 'outerEnvt')36SmalltalkEnvironment#()37LiteralDictionary#()38MethodDictionary#()39PluggableDictionary#('hashBlock' 'equalBlock')4042
40WeakKeyDictionary#()43ExternalFormRegistry#('lockFlag')44WeakIdentityKeyDictionary#()45WeakValueDictionary#()46IdentitySet#()47PluggableSet#('hashBlock' 'equalBlock')48WeakSet#('flag')49SkipList#('sortBlock' 'pointers' 'numElements' 'level' 'splice')50IdentitySkipList#()51WeakRegistry#('valueDictionary' 'accessLock')41
3.9 Heritage et description dierentielleCollection
SequenceableCollection
ArrayedCollection
CharacterArray
String
Symbol
asSet reverse asUppercase size printOn:Figure(7) {Hierarchie d'heritage avec ajouts de fonctionnalites. Pour plus de details sur la description dierentielle, voir notes de cours \Reutilisation/Frameworks". 42
3.10 Schemas de specialisation utilisant l'heritage
Masquage : specialisation d'une methode sur une sous-classe. Masquage partiel : utilisation de la pseudo-variablesuper. Parametrage par specialisation (pseudo-variableself), ou par composition, classiques 3withinthe receiver .If the receiver does not contain anElement,
4answerthe result of evaluating the argument ,exceptionBlock ."6startto : (selfsize )7do: [:indexj(selfat :index) =anElementifTrue : [^index]].8^exceptionBlockvalue Listing (6) {Exemple sur la classe SequenceableCollection
43
3.11 Heritage statique classes-traits et traits-traits
Lestraitsasont des unites de reutilisation predenies partageables et composables, integrees par dierents langages (Pharo, Php, Scals, ...).
1Objectsubclass: #CompteurWTrait2uses:TComparable 3instanceVariableNames:' valeur'4classVariableNames:' '6get7^valeur9
Une classe peut utiliser plusieurs traits; sous reserve de gerer (statiquement) les con its de noms. Un trait peut utiliser un autre trait.
Un trait peut ^etre utilise par un(e) ou plusieurs classes ou traits. 0167-6423.
46
1Traitnamed: #TSortable2uses:fg3category:' Collections-Abstract'5!TSortablemethodsFo r:' sorting'!6sort7"Sortthis c ollectioninto asc endingor derusing the ' <='op erator."8selfsort: [:a:b ja<=b]9"-------------------------"10Collectionsubclas s:#SequenceableCollection11uses:TSortable 12instanceVariableNames:' '13classVariableNames:' '14package:' Collections-Abstract'Listing (9) {Traits, exemple no 2. En utilisant le traitTSortable, la classe
SequenceableCollectionpossed la methodesort, toutes ses instances peuvent
4 Le tout-objet et la meta-programmation
4.1 Denitions
Re exivite: Capacite qu'a un systeme a donner a ses utilisateurs une representation de lui-m^eme en connexion causale avec sa representation eective en machine meta-entite: entite constitutive du meta-niveau donc du langage ou de son environnement Entite de premiere classe: entite, possiblement une meta-entite, ayant une representation accessible dans un programme, que l'on peut referencer, manipuler et inspecter, eteventuellement modier. En Smalltalk, les classes, les methodes compilees, les methodes, le source des methodes, certaines structures de contr^ole, eventuellement la pile d'execution, l'environnement de pro- grammation, le compilateur, ... sont des entites de premiere classe. meta-programmation: programmation des entites constitutives du systeme (meta-entites) en utilisant le systeme. 48
4.2 Meta-programmation basique
4.2.1 Les classes comme \rvalues" standards
La \genericite parametrique" est la capacite a contraindre les structures de donnees com- posites, comme les collections par exemple, a ne contenir que des elements appartenant a des types identiees dans le texte du programme. En typage statique (voir les generiquesJava, les templatesC++) la verication de telles contraintes peut ^etre faite a la compilation. Les classes comme \rvalues", accompagnees d'une primitive de test de sous-typage, per- mettent en typage dynamique un contr^ole dynamique de types. 49
Exemple :
1Pilesubclass: #PileTypee2instanceVariableNames:' typeElements'3classVariableNames:' '4category:' TP1'6push:element 7(elementisKindOf: typeE lements)8ifTrue:[superpush: element ]9ifFalse:[selferror: ' Impossibled ''empiler' ,elementprintStrin g,10'dans une pile d e' ,typeElementspri ntString]Listing (11) {test du type d'un objet stocke dans une variable. A ne pas
confondre avec instanceOf de Java.style 50
4.2.2 Manipulation standard des objets primitifs (rock-bottom objects)
Chaque element d'un type primitif (nombres, caracteres, booleens, cha^nes, tableaux) est represente par un meta-objet qui permet son utilisation comme un objet standard. On peut
La hierarchie des classes representant les nombres. 1Magnitude2Number()3FixedPoint('numerator' 'denominator' 'scale')4Fraction('numerator' 'denominator')5Integer()6LargeInteger()7LargeNegativeInteger()8LargePositiveInteger()9SmallInteger()10LimitedPrecisionReal()11Double()12Float()52
4.2.3 L'objetnil.
nil(nullenJava)est la valeur par defaut du type reference, donc aectee a toutel-value (variable, case de tableau, etc) non explicitement initialisee. Nilest l'unique instance(Singleton)de la classeUndefinedObjectsur laquelle il est possible de denir des methodes. Il est donc possible d'envoyer un message anil.
L'exceptionnullPointerExceptionn'existe pas!
quotesdbs_dbs22.pdfusesText_28
[PDF] La classe Madras se met ? l 'heure d 'été - Air Caraibes
[PDF] Chariot classe mobile Notre catalogue - Techni-Contact
[PDF] 1 Mode - Classe modale 2 Médiane - Classe médiane
[PDF] La classe multiâge par choix - preventionscolaire
[PDF] classes preparatoires aux grandes ecoles - Jamiati
[PDF] Méthodes et variables statiques - Nicolas Baudru
[PDF] Liste modèle de l 'OMS des médicaments essentiels 16e liste
[PDF] Les classes - Autoroutesfr
[PDF] Classement Eduniversal des meilleurs Masters, MS et MBA 2017
[PDF] 2016 24 Heures Motos results - FIM EWC
[PDF] Édition 2017 - Arcep
[PDF] Résultats - Fédération Française de Billard
[PDF] classement cf ccp 2016 - CCP FFM
[PDF] Comparaison 2010 des établissements de santé - HAS