Introduction
Les chapitres 14 et 15 ont respectivement
présenté deux modèles d'organisation d'applications : le modèle
fonctionnel/modulaire et le modèle objet.
Ces deux modèles répondent, chacun à leur manière, aux besoins
du développement d'une application :
-
organisation logique d'un programme : module ou classe
- compilation séparée : module simple
- types abstraits de données : module (type abstrait) ou objet
- réutilisation des composants : foncteurs/partage de types avec
polymorphisme paramétrique ou héritage/sous-typage avec des classes
paramétrées
- modifiabilité des composants : liaison tardive (objet)
Le développement d'une application modulaire commence par son
découpage en unités logiques : les modules. Ensuite vient la
réalisation de leur spécification en écrivant leur
signature, et en dernier l'implantation. Lors de la réalisation d'un module,
il peut être nécessaire de modifier sa signature ou celle de ses
paramètres; il faut alors modifier les sources de celui-ci.
Ceci est peu satisfaisant si ce même module est
déjà utilisé par une autre application. Néanmoins cette démarche offre
un cadre strict et rassurant pour le programmeur.
Dans le modèle objet, l'analyse d'un problème aboutit à la description
de relations entre classes. Si par la suite une classe n'offre pas les
services attendus, il est toujours possible de la sous-classer pour
l'étendre. Cette démarche permet de récupérer de grandes
hiérarchies de classes sans modifier leurs sources, ne modifiant pas
ainsi le comportement d'une autre application
l'utilisant. Malheureusement cette technique est inflationniste et
pose des difficultés de duplication avec l'héritage multiple.
De nombreux problèmes nécessitent des types de données récursifs et
des opérations qui manipulent des valeurs de ces types. Il arrive
souvent que le problème évolue, soit en cours de réalisation, soit en
maintenance, impliquant une extension des types et des
opérations. Aucun de ces deux modèles ne permet l'extension dans les
deux sens. En fonctionnel/modulaire,
les types ne sont pas extensibles, par contre on peut créer de nouvelles
fonctions (opérations) sur ces types.
En objet, on peut étendre les données mais pas les traitements (en
créant une nouvelle sous-classe d'une classe abstraite qui implante
ses méthodes). En cela ces deux modèles sont duaux.
L'avantage de réunir ces deux modèles dans le même langage est de
pouvoir choisir le modèle le plus approprié pour la résolution du
problème posé et de les mixer dans le but de dépasser les limitations
de chaque modèle.