Pourquoi le concept d'objet est-il si important ? Quels sont des grands principes du développement objet ? Pourquoi Java propose à la fois des classes et des objets ? Comment les mettre en oeuvre ?
Principes de la conception objet.
D'après l'ouvrage de Grady BOOCH : analyse et conception orientées objets.
La complexité du logiciel
L'apprentissage de la programmation commence par une longue phase d'écriture de petits logiciels qui ont la particularité d'être spécifiés, analysés, codés, utilisés et maintenus par une même personne travaillant isolément. Les objectifs de ces programmes sont relativement modestes, ils s'inscrivent dans le cadre des projets d'un cours par exemple, ils n'ont pas à être très fiables et ils ont une durée de vie limitée. Leur réutilisation, leur maintenance, ou leur adaptation à des situations nouvelles n'est pas prévue. Si les paramètres du problème changent légèrement, le programme doit être modifié et recompilé. Comme ces programmes peuvent être dominés par une personne seule, l'adaptation se fait généralement par une réécriture complète. Ce sont des programmes à jeter, économiquement adaptés au besoin.
Développer un logiciel de qualité industrielle relève d'une autre problématique. Un tel logiciel a une longue durée de vie, de nombreux utilisateurs dépendent de son bon fonctionnement, le logiciel lui même est tellement complexe qu'un être humain ne peut pas le développer, le maintenir ou le comprendre seul. Le logiciel d'un central téléphonique fait un million de lignes de code, un système d'exploitation coûte 2 000 années-hommes de développement. Nous utilisons tous les jours de tels logiciels : Word, Linux, Windows, Navigator, Myst, les distributeurs de billets de banque, les automates de réservation de place, etc. Si le paramétrage des logiciels était incomplet, si pour frapper un courrier au texteur il fallait modifier le code source du logiciel et le recompiler, où irions nous ? Et si les logiciels n'étaient pas entièrement mis au point, si Windows plantait, ne devrait-on pas dire que le secteur informtique n'est pas aussi mature que les autres secteurs ?
Le logiciel est complexe. Des programmes résolvant des problèmes simples peuvent avoir des comportements internes très complexes. Nous allons ici nous intéresser seulement à la complexité intrinsèque des logiciels, pas à la complexité algorithmique.
La complexité du réel et les briques élémentaires
Un microordinateur est un appareil de complexité moyenne : une unité centrale, un clavier, un écran, un disque dur, des interfaces imprimante et réseau. Chaque partie peut être décomposée en éléments encore plus élémentaires. Par exemple la carte mère comporte une RAM, une ROM, des bus, des processeurs. A son tour, le processeur a une architecture interne, avec des registres, des portes, etc. Et les ordinateurs peuvent être les composants de structures plus vastes, comme des réseaux locaux, qui à leur tour sont des composants d'internet.
Ce sont là des systèmes complexes de nature fractale, c'est à dire que à chaque niveau apparaît une structure, parfois auto similaire. Nous voyons aussi apparaître la nature hiérarchique d'un système complexe. Un système fonctionne parce que
- chacune de ses différentes parties fonctionne,
- et elles coopérent activement.
A chaque niveau nous trouvons un ensemble de composants qui coopèrent pour offrir des services aux niveaux supérieurs, et qui utilisent les services du niveau inférieur. Nous utilisons le système en choisissant le niveau d'abstraction qui convient à nos besoins particuliers, pas un autre. Le cadre qui frappe un rapport ne veut pas se soucier du modèle de processeur de son PC, ni d'internet.
Prenons une plante. Elle est composée de trois structures principales, racines, tiges et feuilles. Chacune de ces structures est composée de cellules. A l'intérieur d'une cellule nous trouvons un autre niveau de complexité, avec un noyau une membrane, etc. Les niveaux de complexité forment, comme dans l'exemple de l'ordinateur, une hiérarchie. La structure fractale apparaît clairement, à chaque échelle les objets ont une structure. La théorie de la relativité d'échelle montre comment cette nature fractale du réel explique les lois de la physique.
Toutes les parties d'un niveau d'abstraction interragissent d'une manière bien définie. Par exemple les racines, responsables de l'extraction dans le sol des éléments nutrififs, les transmettent aux feuilles par les tiges. Les feuilles utilisent l'eau et les minéraux que les tiges lui apportent pour produire de la nourriture par le mécanisme de la photosynthèse. Les racines, les tiges et les feuilles sont interopérables pour la fonction nourriture.
Il y a toujours des frontières très nettement définies entre l'extérieur et l'intérieur d'un niveau d'abstraction donné. Chaque niveau a ses mécanismes internes, on dit en informatique son implémentation, et ses interactions en petit nombre avec les autres niveaux, ont dit ses interfaces.
Dans une plante nous retrouvons des cellules dans toutes les structures. La nature réalise ainsi une économie d'expression, les cellules servent de briques de base pour tous les composants. Dans l'architecture de l'ordinateur, les circuits logiques sont les briques de base. La matière est composée de briques de base, les quarks. L'univers astronomique a pour briques de base, à très grande échelle, des amas de galaxies formant une structure spongieuse.
Les cellules ont chacune leur fonctionnement autonome. Leur coopération produit un comportement de plus haut niveau, supérieur à la somme des comportement individuels.
Toutes les cellules ne sont pas identiques, mais elles partagent des propriétés communes qui font que l'on peut employer le terme générique de cellule. Un conducteur d'automobile peut prendre une voiture -terme générique- qu'il n'a jamais conduite et la faire rouler, avec seulement quelques minutes d'adaptation. Peu importe qu'il y ait une boîte automatique, un starter, une conduite assistée ou autre chose, il suffit d'identifier des propriétés communes, telles que changer de vitesse, démarrer, tourner, etc. Quand quelqu'un sait programmer dans un langage, il a une grande facilité à utiliser un autre langage (du même paradigme, bien sur), après une période d'adaptation.
Classes et objets
La découverte de briques de base, d'abstractions et de mécanismes communs facilite notre compréhension des systèmes complexes.
Un moteur est une partie de l'automobile, qui a sa place précise dans la hiérarchie de complexité des voitures. Un moteur d'automobile est aussi une généralisation des propriétés communes à tous les moteurs, essence, diesel, gaz, V6, V12,... Un moteur turbo diesel est un genre particulier de moteur automobile, distinct des moteurs GPL par exemple. Cela montre que le terme "hiérarchie" n'est pas simple. La plupart des systèmes incorporent plusieurs hiérarchies différentes, ne seraient-ce que fonctionnelle et organique.
Cette relation hiérachique "est un genre particulier de" part d'un point de vue différente de la relation "est une partie de". Ces hiérarchies s'appellent structure de classes et structure d'objets. Ce sont deux hiérarchies ortogonales.
Chaque hiérarchie est contituée de couches, les classes et objets les plus abstraits étant construits sur les plus élémentaires. Le choix de la classe ou de l'objet élémentaire dépend du problème à résoudre. Ces deux hiérarchies ne sont pas indépendantes, chaque objet de la structure d'objets représente une instance spécifique d'une certaine classe. On parle d'architecture d'un logiciel lorsque l'on désigne ses structures de classes et d'objets prises dans leur ensemble.
Complexité, composants, hiérarchies
Selon Booch, il existe cinq attributs communs à tous les sytèmes complexes :
- La complexité prend souvent la forme d'une hiérarchie de sous-systèmes complexes reliés entre eux. Et ceci s'applique de façon récursive (fractale devrait-on dire) jusqu'aux composants élémentaires.
C'est ce principe de décomposition qui nous permet de modéliser les systèmes.
- Le choix des composants primaires d'un système complexe est arbitraire, il dépend de l'observateur du système.
Ce qui est simple pour un observateur peut se situer à un haut niveau d'abstraction pour un aurre. L'échelle est toujours relative.
- Les liaisons intra - composants sont plus fortes que les interfaces entre composants.
Ceci permet d'étudier chaque partie prise isolément.
- Les systèmes complexes sont composés d'un petit nombre de sous - systèmes qui forment des combinaisons et des arrangements variés.Les composants peuvent être réutilisables, véritables briques de base.
- Dans le monde réel, un système complexe qui fonctionne a toujours évolué à partir d'un système simple qui a fonctionné. Un système complexe conçu ex nihilo ne fonctionnera pas. Il faudra tout recommencer à partir d'un système simple qui fonctionne et le faire évoluer.
Niveaux d'abstraction
Lorsque nous essayons de comprendre un système complexe, nous devons penser à tout en même temps. Dans le cas des systèmes discrets, nous devons faire face à un espace d'états de grande taille, embrouillé et souvent non déterministe.
Il est impossible à un seul individu de suivre tous les détails en même temps. Le nombre maximum de paquets d'informations su'un individu peut appréhender en même temps semble être seulement de l'ordre de 7 plus ou moins 2 ! Et de plus la vitesse est aussi un facteur limitatif, le cerveau a besoin de 5 secondes pour accepter un nouveau paquet d'informations.
La complexité des système à concevoir peut être gigantesque, alors que la capacité humaine est stable et limitée. Descartes l'avait bien vu lorsqu'il a proposé sa méthode...
Pour analyser un système, le concepteur doit donc raisonner en termes de niveaux d'abstraction et se doter d'une méthodologie de décomposition hiérarchique. La technologie objet fournit une telle méthodologie.
Voyons ses implications dans le langage Java.
Les opérations de base sur les objets en Java.
|
Syntaxe Java |
Opération |
|
|
class X { définition } |
Déclaration de la classe X |
noms de classes : une majuscule |
|
X o ; |
Instantiation = création de l'objet o |
noms d'objets : une minuscule |
|
Y extends X |
Héritage |
|
|
class X { |
Déclaration de la méthode m |
uniquement dans une classe |
|
o.m ( paramètres ) ; |
Envoi de message |
|
|
finalize { } ; |
Destructeur |
|
|
this |
Référence à l'objet |
dans une méthode |
|
private |
La méthode, ou la variable d'instance, |
notion d'encapsulation |
|
protected |
La méthode, ou la variable d'instance, |
notion d'encapsulation |
|
public |
La méthode, ou la variable d'instance, |
notion d'encapsulation |
|
static |
Variable de classe, non instanciée avec chaque
objet |
|
|
X o ( paramètres ) ; |
Instantiation par appel du constructeur |
|
|
X () { définition } ; |
Constructeur |
|
|
X (paramètres) { définition } ; |
Constructeur |
surcharge du constructeur |
|
super |
super |
L'exemple automate cellulaire permet une illustration simple des notions d'algorithme, de classe, d'objet, de méthode, de constructeur.
Cours d'informatique Ecole des Mines de Nancy
Document :
http://dafne.mines.u-nancy.fr/~tisseran/cours/objet/principes.html
mai 1998 - Dernière mise à jour : novembre
1999
Remarques, suggestions, questions, ... : e-mail tisseran@mines.u-nancy.fr