|
SUR LE CHEMIN D'EIFFEL
Le langage Eiffel, qui a été
créé par Bertrand Meyer et son
équipe, figure aujourd'hui parmi les quelques
environnements de programmation purement par objets
destinés au développement
d'applications industrielles de grande taille. Comme
langage, Eiffel s'est tout d'abord
présenté comme l'intégration de
deux cultures informatiques : celle des
environnements à objets graphiques interactifs
popularisés par Smaltalk, outil
mono-utilisateur puissant de prototypage rapide, et
celle de la tradition génie logiciel
parachevée par Ada, la vision du
développement à grande échelle
pour la production de logiciel fiable, assurant une
plus grande sécurité de fonctionnement.
Ensuite, arrivé à maturité,
Eiffel est passé sous le contrôle du
consortium NICE (Non-Profit International Consortium
for Eiffel) afin de lui donner un statut de langage
public.
Clivage entre "techniques traditionnelles" et
techniques à Objets
Les langages de programmation classiques, aussi
appelés procéduraux, manipulent des
données et des procédures sans qu'il y
ait de contrainte sur les relations entre les
procédures et les données qu'elles
manipulent. Les données ou les
procédures évoluent
inévitablement de façon
désynchronisée. Une modification dans
l'une des parties du logiciel peut finalement avoir
des répercussions inattendues dans une autre
partie et inversement. Des études sur la
maintenance ont d'ailleurs montré qu'environ
40 % des coûts étaient dus aux
changements de spécifications et 20 % aux
changements de format dans les données.
Ajouter un champ à un enregistrement implique
de modifier toutes les parties du programme qui
exploitent cette donnée : dans les passages de
paramètre, les formats d'entrée/sortie,
etc.
Dans un langages à objets, dit
Orienté Objet, les programmes sont construits
autour des données (structures de
données, compte en banque, matrice, simulateur
de vol, ... ). Les données regroupent les
primitives qui y accèdent, les exploitent et
les modifient. En Eiffel, ces manipulations de
données sont, en outre, garanties par des
règles d'intégrité assurant la
cohérence des objets. Cette notion nouvelle,
popularisée par Eiffel et nommée "
conception par contrat ", permet à chaque
objet de n'accéder aux primitives d'un autre
objet qu'en respectant des règles de
visibilité et de contraintes de
validité découlant de la
spécification elle-même. Chaque objet
devient ainsi responsable d'une
délégation d'opération à
un autre objet qui lui-même s'engage à
ne réaliser une opération que
conformément à ce qu'on en attend.
Trop de temps est souvent passé à
ré-inventer des structures classiques de
programme ou plus simplement à refaire moins
bien ce que des spécialistes ont écrit
une fois pour toute de la façon la plus
efficace possible. Dans la technique à objets,
avant d'attaquer un moindre développement, il
est judicieux de se demander avant tout s'il n'existe
pas déjà quelque chose de similaire,
même s'il ne s'agit pas exactement de la
même chose, dans un domaine d'application
proche ou analogue. La technique à objets
permet de travailler par adaptation et modification,
dans le respect de la modularité
existante.
Il est aujourd'hui hors de question de donner le
code source d'une application de plusieurs milliers
(voire plusieurs millions) de lignes à une ou
plusieurs personnes en leur demandant de se plonger
dans les détails techniques. Pour cette
raison, des mécanismes de structuration et de
classification puissants sont indispensables pour
maîtriser la complexité. La structure
d'un système Eiffel est définie par les
constituants suivants:
- des classes d'objets,
- des regroupements de classes en grappes de
grands domaines fonctionnels,
- des relations d'héritage entre classes
afin de combiner ou d'adapter des classes
existantes,
- des relations de clientèle entre classes
permettant de décentraliser et
déléguer les services rendus et les
informations
- maintenues par les classes pour les rendre
disponibles aux autres classes sur la base de
l'établissement de " contrats ".
Une autre idée véhiculée par
Eiffel est qu'un logiciel doit contenir sa propre
documentation afin de minimiser les
incohérences. Pour ce faire, il existe un
mécanisme d'abstraction de classes qui extrait
automatiquement à partir du code source
l'information minimale nécessaire à sa
compréhension et à son utilisation.
Au cours d'une démarche de construction de
systèmes logiciels par objets, la notion de
bibliothèques de composants
réutilisables est primordiale. Il s'agit
à la fois du principal matériau
disponible et de l'une des finalités de
l'activité de développement.
De quoi s'agit-il ? Principalement de se poser
systématiquement la question de savoir si ce
que l'on est en train de produire est susceptible
d'être réutilisé par d'autres
développeurs. Il s'agit ensuite de rendre
véritablement réutilisables les
composants concernés, c'est-à-dire
testés, documentés,
généralisés et
publiés.
Les bibliothèques disponibles avec Eiffel
sont le fruit d'un patient processus d'affinement.
Les classes qui forment ces bibliothèques ont
été intensivement testées et
utilisées dans le cadre de divers
développements réutilisant ces
composants. On trouve des bibliothèques pour
la manipulation des structures de base de la
programmation, pour la gestion de la mémoire,
pour le traitement des exceptions ainsi que pour
l'analyse lexicale et syntaxique. Des
bibliothèques plus spécialisées
concernent la gestion de bases de données et
la construction d'applications graphiques. Ces deux
dernières bibliothèques ont d'ailleurs
été bâties en respectant une
même philosophie de conception : fournir, d'une
part, des classes très générales
utilisables par les programmeurs d'applications et,
d'autre part, fournir des classes
d'implémentation spécifiques d'un SGBD
ou d'un serveur graphique à interface
constante.
Eiffel vise tous les domaines d'applications
informatiques où la fiabilité et la
sécurité des logiciels produits jouent
un rôle prédominant. Curieusement, les
réticences les plus fréquentes viennent
souvent de l'informatique technique, domaine dans
lequel les développeurs sont encore
très soucieux de préserver leur chasse
gardée : celle des optimisations de
très bas niveau ou celle de la connaissance
des mécanismes d'implémentation des
compilateurs. Les exigences de réutilisation
imposent désormais de faire reposer les
problèmes très pointus
d'implémentation sur les seuls
spécialistes et non sur les concepteurs des
architectures logicielles de demain.
Eiffel n'intéresse en fait pas seulement
l'informatique technique, mais aussi et surtout
l'informatique de gestion puisque la maintenance de
données cohérentes en est le pain
quotidien.
Très fréquemment, le choix d'Eiffel
intervient dans des applications
caractérisées par une grande
complexité de situations ou d'information,
imposant alors un effort important de structuration
et de classification appuyé par des
mécanismes solides de contrôle de
validité. Eiffel est actuellement disponible
sur une très large gamme de stations de
travail de type Unix, mais aussi sur DOS/Windows et
Mac OS-10, VMS.
Au-delà des objets ordinaires, les objets
spécifiésQuand faut-il
réutiliser des objets existants ? S'ils sont
bien spécifiés, on doit les
réutiliser chaque fois que leurs
spécifications correspondent aux besoins du
développement en cours. Si, par contre ils
sont mal spécifiés voir pas
spécifiés sauf par quelques
commentaires qui, nécessairement, laissent
beaucoup de choses telle que les conditions aux
limites, dans le flou, alors, il ne faut pas
réutiliser. Même, si par hasard, un tel
composant fait approximativement ce que vous
désirez à un moment donné,
aucune garantie n'existe que la révision
suivante aura toujours le même comportement. En
effet, l'auteur d'un tel composant peut penser que le
comportement doit être modifié pour
satisfaire d'autres besoins, peut être plus
généraux soit, mais qui ne sont pas les
vôtres. Pour l'ingénieur, le meilleure
n'existe pas. Le concept de qualité n'existe
que par rapport à une spécification
précise. Un composant est meilleur qu'un autre
seulement s'il couvre mieux les
spécifications. D'un part la sienne, d'autre
part celle souhaitée. Pour satisfaire cette
exigence de spécification, Eiffel incorpore la
programmation par contrattm. Ceci consiste
à incorporer des assertions qui forment la
spécification des classes de composants (les
invariants) et la spécification
d'entrée sortie de chaque routine
(pré-conditions et post-conditions). Certes,
il existe des langages de spécification
cependant, ils sont disjoints des codes
d'implémentation. Ceci les rends
généralement impropres à assurer
la qualité des implémentations ainsi
spécifiées. Le couplage fort de la
spécification et du code donne bien d'avantage
de garantie dans cette direction notamment parce que
cette spécification est la base même du
déverminage et que de surcroît,
l'acquéreur peut lui même faire tourner
ce composant acquis en mettant en oeuvre la
spécification et ainsi vérifier par
lui-même que le composant satisfait bien sa
spécification. Même, si cette
méthode a des limites, elle constitue un pas
définitif vers des logiciels de qualité c'est
à dire d'abord correct.
Références
B. Meyer: Eiffel: the language; Prentice-Hall,
Object-Oriented Series, 1992
J.-M. Nerson : Applying object-oriented analysis
and design; Communications of the ACM, vol. 35, n'
9,sur le réseau UUnet (comp.lang.eiffel).
Le present texte s'inspire également d'un
article de JEAN-MARC NERSON & YVAN GALISSON de
décembre 1991
Voir aussi sur le net
Abstraction.ch all rights reserved
|