L’encapsulation

Prototype


Version de

La programmation simpliste d’un type de données abstrait, consiste à réécrire chaque fois que nécessaire l’ensemble des fonctions applicables aux données manipulées. Ainsi on écrit une pile de nombres pour une calculatrice et une pile de blocs libres pour la gestion d’un disque et une pile pour la saisie des caractères. De même on écrit un programme de gestion d’un arbre pour les répertoires et un autre pour l’analyse syntaxique d’une expression. Une autre approche réalise une fois pour toutes un module qui ne représente aucun objet concret, mais seulement un modèle de la structure de données, c’est à dire son fonctionnement. L’ensemble des fonctions est prévu pour s’appliquer aussi bien à des entiers, à des flottants, des tableaux, des structures ou autre. Le programmeur-utilisateur de ce module doit alors explicitement créer un objet à l’aide d’une opération appelée constructeur définie dans le module. On dit que l’on crée une instance du type abstrait. La fonction constructeur associe les données du programme effectivement traitées aux fonctions préalablement définies. Dans l’exemple ci-dessous\footnote{Le programme complet est en annexe}, on commence par indiquer que la liste s’applique à des entiers ( liste(entier)), puis dans le main, on créé une variable l du type liste d’entier (entierliste l) et enfin on instancie cette liste d’entiers au moyen du constructeur ( l = entierliste_creer (entier_copier, 0, entier_editer) ;). Après cette phase d’initialisation, on peut utiliser toutes les fonctions du type de données choisi en répondant à la question que faire ? et non plus comment faire ?.
/* 
 * jjd                        Liste1.c
 */
#include "Liste.tda"
/* ci-dessous : Creation du nouveau type pointeur sur int */
typedef int  *entier ;     
liste(entier) ;

/* fonctions particulieres au nouveau type */

void entier_editer(entier i)
{ printf("%d", *i) ; }

entier entier_copier(entier i)
{
    entier      j ;
    j = (entier) malloc(sizeof(*i)) ;
    *j = *i ;
    return j ;
}

void main()
{
    entierliste   l ;
    entier        x ;
    int           i ;

/* Instanciation */
    l = entierliste_creer(entier_copier, 0, entier_editer) ;

    for (i = 0 ; i < 5 ; i++)
    {
        x = entier_copier((entier) & i)         ;
        entierliste_insererapres(l, (entier) x) ;
    }
    entierliste_afficher(l) ;
}
L’encapsulation