Les bibliothèques d objets Implantations d objets réutilisables : les approches Les bibliothèques d objets généraux C++ La STL : standard template library L OCL : Open Class Library QT : Bibliothèque utilisé avec KDE Java Bibliothèque du langage très riche C# Bibliothèque de la CLI/CLR très riche reprenant le modèle de la CLR (ie. Aussi disponible pour d autres langages basés sur la CLR comme C++/CLI, Python.NET, Perl for NET ) 1
Les bibliothèques d objets spécialisés Graphiques wxwindow, MFC, QT, GTK+ Spécialisées XML-XSLT Parser Xalan, Xercès Boost::Spirit Multi-plateforme wxwindow, GTK+, Multi-langage TK (perl/tk, C++/TK, TCL/TK).net CLR/CLI Grandes variétés de bibliothèques Exemple C++ http://www.trumphurst.com/cpplibs1.html liste un ensemble de bibliothèques pour C++ www.boost.org : organisme de certification de bibliothèques pour C++ 2
Le problème des bibliothèques d objets Une bibliothèque Une conception des classes et objets Une implantation spécifique de nombreuses notions Un choix d algorithmes Difficultés La conception des classes et objets peut impacter l utilisation L implantation spécifique empêche le déploiement sur plusieurs architectures Le choix des algorithmes impacte sur les performances Les objets d une bibliothèque ne sont pas facilement réutilisables avec une autre bibliothèque Les «bonnes et mauvaises nouvelles» Les «bonnes nouvelles» On retrouve les mêmes notions dans les bibliothèques Il existe deux architectures de bibliothèques en général Les «mauvaises nouvelles» Les interfaces des objets sont rarement compatibles d une bibliothèque à l autre Rarement une bibliothèque offre tous les objets souhaités Le choix de la bibliothèque est souvent dicté par la plateforme ou l outil d implantation 3
Les tentatives pour uniformiser les bibliothèques Normaliser la bibliothèque dans le langage C++ : la STL est la bibliothèque standard de C++.net : CLR/CLI est la bibliothèque standard normalisé Forcer les développeur à respecter un style d implantation Java : obligation d implanter des composants respectant des interfaces ad hoc, contrainte naissant du langage et des bibliothèques fournies C++ : organisme de «certification ad hoc» des bibliothèques comme boost (extension de la STL) Les conséquences en pratique C++ STL se veut un standard Énormément de bibliothèque non compatible avec la STL (Xerces, Qt, ) raison : C++ ne peut-être réduit à un style de programmation Java.net Tous les packages sont interopérables et reposent sur une hiérarchie d objets Reproduction de la situation de C++ raison : plusieurs langages dont C++ plusieurs styles de composants 4
Les deux architectures de bibliothèques L approche hiérarchique (Java,.net, Xercès) Toute classe dérive d une classe de base Tout algorithme générique manipule des objets de la classe de base L approche générique (STL, ATL, boost,.net) Des classes atomiques Des classes stockant des objets atomiques Des algorithmes manipulant des ensembles d objets atomiques Les approches mixtes (QT, Standard) Des classes atomiques Des classes dérivant impérativement d une classe de base (élément UI, persistance, sérialisation) Certains algorithmes génériques manipulent des ensembles d objets atomiques D autres algorithmes génériques manipulent des objets de la classe de base L architecture hiérarchique La définition d une classe de base: Java : Object QT (C++) : QObject protected Object clone() boolean equals(object obj) void finalize() Class getclass() int hashcode() void notify () void notifyall() String tostring() void wait() QObject ( QObject * ) virtual ~QObject () virtual bool event ( QEvent * ) virtual bool eventfilter ( Q Object *, QEvent * ) virtual const char* classna me () const bool isa ( const char * ) con st bool inherits ( const char * ) const const char* name () const 5
Les objets atomiques Objets atomiques : «objet stockant un ensemble unique d information» Ils doivent dériver de l objet unique En Java : Dérivation systématique de l élément de base Integer dérive de Object String dérive de Object KeyPair dérive de Object AbstractCollection dérive de Object Sous QT Dérivation par catégorie d éléments Tous les éléments d UI dérivent de QObjet (QEvent, QBrush, ) Toutes les collections dérivent d un objet QCollection Les ensembles d objets Deux approches Ensemble ne supportant que des objets d un type (homogène) Ensemble supportant des objets de type différents (hétérogènes) Deux implantations L ensemble d objets ne stocke pas les objets, ils pointent sur les objets L ensemble d objets stocke les objets, il alloue les objets 6
La pratique dans les hiérarchies Approche Java/.net 1 Les collections sont hétérogènes (les valeurs dérivent toutes de Object) Les éléments ne sont pas stockés dans l objet AbstractCollection Les défauts sont à modérer depuis les génériques en Java/.net 2.0 Avantage de l approche Un seul code pour tous les types (compacité du programme) Inconvénient Pas de garantie sur les types des données dans la collection Partage des données entre l ensemble et l extérieur Force à faire du transtypage Result = (montype) macollection.get(index); Les algorithmes Pas de séparation entre les algorithmes et les structures de données Les classes implantant les structures de données fournissent les algorithmes qui manipulent les données Arrays fournit «fill» pour remplir le tableau HashSet fournit «contains» pour tester si un élément est dans la table de Hash 7
L architecture générique Architecture introduite avec C++ Utilise les modèles (abuse des modèles?) Orientée «performance» Orientée «sûreté» Orientée «réutilisation maximale du code» Les objets atomiques Aucune contrainte sur un objet atomique «a priori» Quid des contrats Un algorithme peut imposer un contrat pour accepter de manipuler un objet atomique Une structure de données/ensemble de données peut imposer un contrat pour manipuler un objet atomique 8
Les ensembles de données (conteneur) Un ensemble de données Est homogène : tous les éléments ont le même type Stocke les objets en son sein : Ajouter un objet à un conteneur 1. crée une zone pour stocker l objet 2. copie l objet dans cette zone Un conteneur Peut stocker une seule donnée std::auto_ptr (stocke un pointeur sur une donnée) Peut stocker plusieur données std::pair std::vector Les conteneurs (suite) Avantages Le type des données est connu (Pas besoin de transtyper) std::vector<int> tableau int i = tableau[4]; Les données sont copiées dans le conteneur, Elles sont protégées Elles sont détruites à la fin Inconvénients Les données sont copiées dans le conteneur, Parfois nécessaire de partager des données Incompatible avec des données hétérogènes Le code est dupliqué pour chaque type de données Ne supporte pas les ensembles de types hétérogènes 9
Les algorithmes Si l algorithme est propre à une structure de données Il est implanté dans la structure de données Si l algorithme peut fonctionner pour plusieurs structures de données Il est implanté en dehors de la structure de données Les itérateurs Problème Manipuler des éléments dans des structures de données sans connaître la structure Solution Un itérateur : ie. un pointeur intelligent sur un élément stocké dans une structure de données La structure de données doit Retourner un itérateur pointant sur le premier élément Retourner un itérateur pointant sur l élément situé après le dernier élément L itérateur doit Permettre d accéder à la donnée D aller à la donnée suivante Eventuellement revenir à la donnée précédente Pouvoir tester s il pointe sur la même donnée qu un autre itérateur 10
Mise en œuvre #include <vector> #include <algorithm> using namespace std; vector<int> vec; vec.push_back (10); vec.push_back (3); vec.push_back (7); vector<int>::iterator mx = max_element(vec.begin()+1, vec.end()); cout << mx << endl; // Affiche 7 sort(vec.begin(), vec.end()); // Le vecteur contient 3, 7, 10 Les itérateurs Un algorithme peut avoir besoin d un accès plus ou moins performant Contrat d itérateur plus ou moins contraignant Une structure de données doit elle aussi respecter un contrat (contrat associé à la notion de conteneur) Exemple std::sort(iterator itbegin, iterator iend) : a besoin d un accès aléatoire à chacun des éléments stockés dans une structure de données std::max_element(iterator itbegin, iterator iend) : peut se contenter d un accès séquentiel aux éléments stockés dans une structure de données 11
Respect des règles pour les nouveaux objets Éléments atomiques Doivent respecter les éventuels contrats pour une utilisation particulière Structures de données Assimilable à un conteneur : doit fournir les méthodes demandées par un conteneur Sinon même contrainte que pour un élément atomique Algorithmes Applicables sur plusieurs structures de données assimilables à des conteneurs fonctions manipulant des itérateurs Sinon, implantées avec l objet ou la classe les utilisant Conclusion Les bibliothèques d objets Grande richesse de code réutilisable Impacte sur le modèle objet de l application Rarement inter-opérables (implique souvent des adaptations des objets) Environnement Java/.net Bibliothèques de composants hiérarchiques Relativement simple à mettre en œuvre Impact négatif sur les performances et sur la sûreté de fonctionnement Langage C++/ Environnement.net Bibliothèques de composants hiérarchiques ou génériques Plus lourd à mettre en œuvre (plus de notions) Gain performance/sûreté 12
Et pour aller plus loin http://java.sun.com/javase/6/docs/api/ la documentation de la bibliothèque pour java http://java.sun.com/docs/books/tutorial/index.html les tutoriaux de java http://www.boost.org/ les bibliothèques labellisées boost pour C++ http://ens.lal.in2p3.fr/mg/stl.html Une introduction à la STL Plus les liens sur la page de cours, notamment le cours C++ de Christian Casteyde http://www.greyc.ensicaen.fr/ensicaen/cpp/book1.html 13