Author: Christian.Queinnec@lip6.fr

## 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.