En anglais, le terme « wrapper » désigne entre autres un papier d’emballage ou une jaquette de livre. Dans le domaine in­for­ma­tique, le terme désigne un programme ou code qui « enveloppe », ou englobe, d’autres com­po­sants logiciels. Plusieurs raisons motivent le recours aux wrappers.

La com­pa­ti­bi­lité et l’in­te­ro­pé­ra­bi­lité entre des struc­tures lo­gi­cielles hé­té­ro­gènes en sont une et la re­pré­sen­ta­tion visuelle une autre, à l’image des wrappers HTML et CSS. Un wrapper peut s’appliquer à un composant logiciel, un produit logiciel in­dé­pen­dant, une ar­chi­tec­ture lo­gi­cielle, une classe en pro­gram­ma­tion orientée objet ou un framework.

Si un programme inclut des fonctions ou blocs écrits dans un autre langage de pro­gram­ma­tion, on peut les en­ve­lop­per à l’aide d’un wrapper. Le programme principal com­mu­nique ex­clu­si­ve­ment avec le wrapper, qui transmet les ins­truc­tions à la partie en­ve­lop­pée du programme et renvoie les résultats. Le wrapper est le seul composant qui com­mu­nique di­rec­te­ment avec les deux parties du programme.

Les wrappers ont de multiples usages en pro­gram­ma­tion et en dé­ve­lop­pe­ment logiciel. Les exemples d’ap­pli­ca­tion suivants montrent comment fonc­tionne un wrapper et les tâches qu’il peut réaliser.

Le wrapper pour convertir des saisies d’uti­li­sa­teur

Les for­mu­laires présents dans les pro­grammes ou ap­pli­ca­tions Web re­quiè­rent la saisie de données pouvant être traitées par le programme. Dans le monde anglo-saxon, on tient parfois pour acquis que les chiffres s’écrivent et doivent être saisis avec un point pour séparer les décimales (au lieu d’une virgule) et les di­men­sions en pieds et en pouces.

Or, quand on utilise ce genre de composant dans ses propres ap­pli­ca­tions, il n’est pas toujours possible de les adapter aux spé­ci­fi­ci­tés d’écriture locales, ce qui aboutit iné­vi­ta­ble­ment à des résultats erronés, voire des bugs.

Dans ces cas-là, un wrapper peut s’avérer utile. Le for­mu­laire de saisie ne transmet pas les saisies di­rec­te­ment au programme externe, mais au wrapper. Celui-ci examine les saisies et les convertit en saisies valides pour le programme externe sans que ce dernier n’ait besoin d’être modifié.

Le wrapper pour accéder à des bases de données

Les bases de données de four­nis­seurs dif­fé­rents sont gé­né­ra­le­ment dif­fi­ciles à utiliser ensemble, puisque les tables de données, requêtes et langages de requête ne sont pas com­pa­tibles. Là encore, un wrapper peut être la solution. Comme dans n’importe quel type de wrapper, l’idée est de repérer les in­co­hé­rences entre des in­ter­faces lo­gi­cielles dif­fé­rentes et de les pallier avec le wrapper.

L’interface Java Database Con­nec­ti­vity (JDBC), qui est une interface de base de données de la pla­te­forme Oracle Java, est un exemple type de wrapper. JDBC permet, quand elle est utilisée comme fonction wrapper, d’accéder à des bases de données re­la­tion­nelles de four­nis­seurs logiciels dif­fé­rents. Elle établit une liaison avec les bases de données au moyen de pilotes spéciaux.

Les requêtes SQL des pro­grammes sont adressées à JDBC et non aux bases de données elles-mêmes. JDBC convertit les requêtes dans le langage d’in­ter­ro­ga­tion employé par la base de données concernée et renvoie le résultat dans un format com­pa­tible avec Java. De cette manière, le programme à l’origine de la requête reçoit sys­té­ma­ti­que­ment les données dans un même format, in­dé­pen­dam­ment de la base de données utilisée.

Le wrapper en pro­gram­ma­tion orientée objet

En pro­gram­ma­tion orientée objet, on fait appel à des patrons de structure, qui fonc­tion­nent de manière identique quel que soit le langage utilisé. Les patrons de con­cep­tion adap­ta­teur et dé­co­ra­teur entrent dans la catégorie de ces patrons de structure et sont con­si­dé­rés comme des wrappers.

Un adap­ta­teur enclave des in­ter­faces mu­tuel­le­ment in­com­pa­tibles entre des classes dif­fé­rentes. En con­ver­tis­sant une interface en une autre, les classes peuvent à nouveau échanger entre elles. C’est très utile lorsque des classes ou des bi­blio­thèques de classes entières doivent être réu­ti­li­sées dans de nouveaux projets. Ces bi­blio­thèques emploient des in­ter­faces stan­dar­di­sées dis­tinctes qui ne peuvent pas être modifiées, car elles doivent être valables pour une multitude de pro­grammes. Le wrapper (ici l’adap­ta­teur) agit comme un in­ter­mé­diaire décisif dans la com­mu­ni­ca­tion.

Un dé­co­ra­teur permet d’enrichir une classe de fonctions sup­plé­men­taires sans la modifier. Le dé­co­ra­teur a, par rapport à l’objet appelant, la même interface que la classe d’origine. De fait, il n’y a rien à modifier dans l’objet appelant. Le dé­co­ra­teur, en tant que wrapper, transmet les appels à la classe. Il exécute di­rec­te­ment les nouvelles fonctions qui ne sont pas contenues dans la classe. Enfin, il renvoie les résultats de telle sorte que ceux-ci ap­pa­rais­sent à l’objet appelant comme des résultats de la classe décorée.

Le wrapper pour concevoir des documents HTML

Les wrappers sont fré­quem­ment utilisés dans la con­cep­tion (et la refonte) de sites Web en HTML et CSS. Sans eux, pour effectuer certaines mo­di­fi­ca­tions, par exemple pour modifier la taille des marges, il faudrait modifier plusieurs feuilles de style en veillant si­mul­ta­né­ment à ce qu’elles coïn­ci­dent.

Il est plus simple de placer un wrapper sous forme de conteneur DIV autour du contenu entier de la page, comme dans l’exemple suivant :

<html>
    <head>
    ...
    </head>
    <body>
        <div class="wrapper">
        …
        </div>
        </body>
</html>

Le contenu réel de la page se trouve alors à l’intérieur du conteneur wrapper.

Les pro­prié­tés du wrapper sont définies dans le fichier CSS lié :

body {
	margin: 0;
	padding: 0
}
.wrapper {
	width: 500px;
	margin: 25px auto;
}

Dans cet exemple, on attribue une largeur de 500 pixels au conteneur via la propriété width:. Les marges en haut et en bas sont définies à 25 pixels via la propriété margin:. Les marges à gauche et à droite découlent au­to­ma­ti­que­ment de la largeur de la fenêtre de na­vi­ga­teur et de la largeur du conteneur.

Par une mo­di­fi­ca­tion simple du wrapper, il est possible d’adapter fa­ci­le­ment les marges sans toucher davantage au code HTML ou CSS.

Wrapper TCP dans les systèmes Linux

Le service d’arrière-plan inetd, que l’on trouve sur Linux et d’autres systèmes d’ex­ploi­ta­tion basés sur UNIX, s’exécute comme wrapper TCP. inetd écoute les con­nec­teurs (sockets) réseau et accepte les demandes de connexion. Un fichier de con­fi­gu­ra­tion définit les ports qui doivent être sur­veil­lés. Les demandes sont examinées et le service inetd indiqué dans le fichier de con­fi­gu­ra­tion est démarré pour le port concerné. Le plus souvent, ces pro­grammes sont des daemons qui tournent en arrière-plan.

Une fois la connexion terminée, inetd met fin au­to­ma­ti­que­ment au service démarré. Le démarrage à la demande fait éco­no­mi­ser des res­sources système par rapport au démarrage au­to­ma­tique de services réseau éven­tuel­le­ment pas utiles du tout. inetd fonc­tionne comme un wrapper auquel tous les pro­grammes adressent leurs demandes réseau sans com­mu­ni­quer di­rec­te­ment avec les services in­di­vi­duels.

Les wrappers TCP peuvent aussi servir à empêcher des accès in­dé­si­rables provenant d’un réseau. Le wrapper TCP est alors appelé par inetd ou par un logiciel de serveur spécial. Les hôtes et or­di­na­teurs autorisés et interdits sont inscrits dans les fichiers /etc/hosts.allow et /etc/hosts.deny.

Aller au menu principal