Das englische Wort „Wrapper“ be­zeich­net z. B. Ver­pa­ckun­gen oder Buch­um­schlä­ge. Im Zu­sam­men­hang mit Software steht der Begriff für Programme oder Codes, die andere Pro­gramm­kom­po­nen­ten umgeben. Für den Einsatz von Wrappern gibt es un­ter­schied­li­che Gründe: Oft geschieht es im Hinblick auf Kom­pa­ti­bi­li­tät oder In­ter­ope­ra­bi­li­tät zwischen ver­schie­de­nen Software-Struk­tu­ren oder auch aus Gründen der optischen Dar­stel­lung, wie etwa bei HTML- oder CSS-Wrappern. Bei einem Wrapper kann es sich um einzelne Software-Kom­po­nen­ten, ei­gen­stän­di­ge Software-Produkte, Software-Ar­chi­tek­tu­ren, Klassen in der ob­jekt­ori­en­tier­ten Pro­gram­mie­rung oder Frame­works handeln.

Sollen innerhalb eines Programms Funk­tio­nen oder Pro­gramm­blö­cke einer anderen Pro­gram­mier­spra­che genutzt werden, kann man diese mit einem Wrapper „umhüllen“. Das Haupt­pro­gramm kom­mu­ni­ziert aus­schließ­lich mit dem Wrapper, der die Befehle an das umhüllte Programm wei­ter­lei­tet und umgekehrt die Er­geb­nis­se zu­rück­lie­fert. Der Wrapper selbst ist die einzige Kom­po­nen­te, die direkt mit beiden Pro­gramm­tei­len kom­mu­ni­ziert.

Wrapper lassen sich in der Pro­gram­mie­rung und Software-Ent­wick­lung viel­fäl­tig einsetzen. Wie ein Wrapper genau funk­tio­niert und welche un­ter­schied­li­chen Aufgaben er übernimmt, zeigen die folgenden An­wen­dungs­bei­spie­le.

Wrapper als Über­set­zer für Be­nut­zer­ein­ga­ben

Formulare in Pro­gram­men oder Web­an­wen­dun­gen erwarten Eingaben, die das Programm ver­ar­bei­ten kann. So geht man bei Pro­gram­men aus dem bri­ti­schen Raum oft fast selbst­ver­ständ­lich davon aus, dass Zahlen mit De­zi­mal­punkt statt Komma und Maße in Fuß und Zoll ein­ge­ge­ben werden. Nicht immer besteht bei der Nutzung solcher Pro­gramm­kom­po­nen­ten in eigenen An­wen­dun­gen die Mög­lich­keit, diese an die hier­zu­lan­de üblichen Be­nut­zer­ein­ga­ben an­zu­pas­sen, was un­wei­ger­lich zu falschen Er­geb­nis­sen oder sogar Pro­gramm­feh­lern führt.

In solchen Fällen bietet sich ein Wrapper an. Das Ein­ga­be­for­mu­lar leitet die Eingaben nicht direkt an das externe Programm weiter, sondern an den Wrapper. Dieser wertet die Eingaben aus und übersetzt sie in gültige Eingaben für das externe Programm, ohne dass es verändert werden muss.

Wrapper beim Zugriff auf Da­ten­ban­ken

Da­ten­ban­ken un­ter­schied­li­cher Her­stel­ler lassen sich nor­ma­ler­wei­se kaum zusammen nutzen, da Da­ten­ta­bel­len, Abfragen oder Ab­fra­ge­spra­chen nicht kom­pa­ti­bel zu­ein­an­der sind. Auch hier kann ein Wrapper die Lösung sein. Wie bei jeder Art von Wrappern geht es darum, In­kon­sis­ten­zen zwischen ver­schie­de­nen Software-Schnitt­stel­len zu erkennen und mit dem Wrapper zu über­brü­cken.

Die Java Database Con­nec­ti­vi­ty (JDBC), eine Datenbank-Schnitt­stel­le aus der Oracle-Java-Plattform, ist ein typisches Beispiel für einen Wrapper. Die JDBC er­mög­licht in ihrer Funktion als Wrapper den Zugriff auf re­la­tio­na­le Da­ten­ban­ken un­ter­schied­li­cher Software-Anbieter. JDBC baut die Ver­bin­dung zu den einzelnen Da­ten­ban­ken über spezielle Treiber auf. SQL-Anfragen von Pro­gram­men richten sich aus­schließ­lich an JDBC und nicht an die Da­ten­ban­ken selbst. JDBC setzt die Anfragen in die von der je­wei­li­gen Datenbank ver­wen­de­te Ab­fra­ge­spra­che um und liefert das Ergebnis in einer Java-kom­pa­ti­blen Form zurück. So erhält das ab­fra­gen­de Programm die Daten immer in einem ein­heit­li­chen Format, un­ab­hän­gig von der ver­wen­de­ten Datenbank.

Wrapper in der ob­jekt­ori­en­tier­ten Pro­gram­mie­rung

In der ob­jekt­ori­en­tier­ten Pro­gram­mie­rung nutzt man ver­schie­de­ne Struk­tur­mus­ter, die un­ab­hän­gig von der tat­säch­lich ver­wen­de­ten Pro­gram­mier­spra­che prin­zi­pi­ell immer gleich funk­tio­nie­ren. Die Ent­wurfs­mus­ter (Design Patterns) Adapter und Dekorator gehören zur Kategorie der Struk­tur­mus­ter und werden als Wrapper be­zeich­net.

Ein Adapter verhüllt zu­ein­an­der in­kom­pa­ti­ble Schnitt­stel­len zwischen einzelnen Klassen. Durch die Über­set­zung einer Schnitt­stel­le in eine andere können die Klassen wieder mit­ein­an­der kom­mu­ni­zie­ren. Das ist besonders wichtig, wenn Klassen oder ganze Klas­sen­bi­blio­the­ken in neuen Projekten wei­ter­ver­wen­det werden sollen. Diese Bi­blio­the­ken nutzen ein­deu­ti­ge, stan­dar­di­sier­te Schnitt­stel­len, die nicht verändert werden dürfen, da sie für eine Vielzahl an Pro­gram­men gültig sein sollen. Der Wrapper – hier der Adapter – stellt bei der Kom­mu­ni­ka­ti­on das ent­schei­den­de Zwi­schen­glied dar.

Ein Dekorator er­mög­licht es, eine Klasse um zu­sätz­li­che Funk­tio­nen zu erweitern, ohne die Klasse selbst zu verändern. Der Dekorator hat gegenüber dem auf­ru­fen­den Pro­gramm­ob­jekt dieselbe Schnitt­stel­le wie die Ori­gi­nal­klas­se. Auf diese Weise muss im auf­ru­fen­den Objekt nichts verändert werden. Der Dekorator gibt als Wrapper die Aufrufe an die Klasse weiter. Neue Funk­tio­nen, die in der Klasse nicht enthalten sind, arbeitet der Dekorator direkt ab. Die Er­geb­nis­se gibt er auf eine solche Weise zurück, dass sie dem auf­ru­fen­den Objekt wie Er­geb­nis­se der de­ko­rier­ten Klasse angezeigt werden.

Wrapper zur Ge­stal­tung von HTML-Do­ku­men­ten

Bei der (Um-)Ge­stal­tung von Websites mit HTML und CSS kommen häufig Wrapper zum Einsatz. Sonst müsste man auch bei einzelnen An­pas­sun­gen, z. B. beim Ändern der Abstände am Rand des Brow­ser­fens­ters, mehrere Style­sheets ändern und darauf achten, dass diese an­schlie­ßend wieder zu­sam­men­pas­sen.

Einfacher ist es, einen Wrapper in Form eines DIV-Con­tai­ners um den gesamten Inhalt der Seite zu legen wie im folgenden Beispiel:

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

Innerhalb dieses Wrapper-Con­tai­ners steht dann der ei­gent­li­che Inhalt der Seite.

In der zu­ge­hö­ri­gen CSS-Datei wird der Wrapper als Style­sheet definiert:

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

In diesem Beispiel wird dem Container über den Parameter width: eine Breite von 500 Pixel zu­ge­ord­net. Die Ränder oben und unten werden über den Parameter margin: auf 25 Pixel fest­ge­legt. Die Ränder links und rechts ergeben sich au­to­ma­tisch aus der Breite des Brow­ser­fens­ters und der Breite des Con­tai­ners.

Durch einfache Ver­än­de­rung des Wrappers lassen sich die Sei­ten­rän­der leicht anpassen, ohne weiter in den HTML- oder CSS-Code ein­zu­grei­fen.

TCP-Wrapper in Linux-Systemen

Der Hin­ter­grund­dienst inetd in Linux und anderen auf UNIX basierten Be­triebs­sys­te­men läuft als TCP-Wrapper. inetd hört Netzwerk-Sockets ab und nimmt Ver­bin­dungs­an­fra­gen an. Eine Kon­fi­gu­ra­ti­ons­da­tei legt fest, welche Ports be­rück­sich­tigt werden sollen. Die Anfragen werden aus­ge­wer­tet, und der jeweils in der Kon­fi­gu­ra­ti­ons­da­tei an­ge­ge­be­ne inetd-Dienst wird für diesen Port gestartet. In den meisten Fällen handelt es sich bei diesen Pro­gram­men um Daemons, die im Hin­ter­grund laufen.

Wird die Ver­bin­dung beendet, stoppt inetd den ge­star­te­ten Dienst au­to­ma­tisch wieder. Durch das Starten bei Bedarf kann man die Sys­tem­res­sour­cen deutlich einsparen gegenüber dem au­to­ma­ti­schen Starten von eventuell gar nicht be­nö­tig­ten Netz­werk­diens­ten. inetd arbeitet als Wrapper, an den alle Programme ihre Netz­werk­an­fra­gen stellen, ohne mit den einzelnen Diensten direkt zu kom­mu­ni­zie­ren.

TCP-Wrapper können auch dafür ein­ge­setzt werden, un­er­wünsch­te Zugriffe aus einem Netzwerk zu un­ter­bin­den. Der TCP-Wrapper wird dabei von inetd oder spe­zi­el­ler Server-Software abgefragt. Die zu­läs­si­gen oder ab­zu­leh­nen­den Hosts und Computer werden in den beiden Dateien /etc/hosts.allow und /etc/hosts.deny ein­ge­tra­gen.

Zum Hauptmenü