Wrapper Facade

Zweck

Das Wrapperfacade kapselt die Funktion und die Daten der exisitierenden nicht objektorientierten Betriebssystemshnitstellen (API) mit robusten Klassenschnittstellen.

Literatur

Douglas Schmidt: System Programming with C++-Wrappers 10/92
Mit C++-Wrappern wie ACE kann man sicher und portablel programmieren.

Gedanken zum Abstraktionsniveau

Der Wrapper soll eine gute Abstraktion darstellen

Wenn man das Abstraktionsniveau zu niedrig ansetzt, hat man eine neue zusätzliche API erfunden. Beispielsweise ist das direkte Wrappen von CORBA oft dazu, daß man fast eine 1:1-API hat. Damit braucht man zum Verständnis eine Dokumentation der Komplexität des CORBA-Standards, oder den Sourcecode. Damit hat man nichts gewonnen.

Der Wrapper sollte sich an der Anwendung orientieren.
Das Wrappen zum Selbstzweck ist brotlos und führt zu komplexen 1:1-API-Wrappern, die schwer zu durchschauen und zu debuggen sind. (empfiehlt auch das Handbuch der Softwarearchitektur)
Auf einem konkreten System kann man die Leistungsspezifika gar nicht ausnutzen, wenn man eine ungeeignete API nutzt.(Subsidaritätsprinzip)
Beispiel: Logging von großen Datenmengen bei RACE-Logger: Beim vorhandensein Asynchoner IO (Windows ?) könnte man die Festplatte als eigenen Thread auffassen, der asynchron für die Persistenz von Speicherblöcken sorgt.
Die existierende Implementierung auf Linux verwendet einen eigenen Thread. Die asynchrone IO war damals nur in der libc emuliert, und deswegen habe ich mich damals lieber auf die eigene Implementierung im active Object pattern (Logger Objekt mit internem Thread) verlassen. Wenn Windows nun in diesem Punkt mehr bietet, dann muß die Abstraktion, daß ein Dumpable einem Logger übergeben wird, anders realisiert werden.
Diese Logger/Dumpable Abstraktion sehe ich als ein Beispiel für Portabilität auf höheren Abstraktionsniveau, wo allerdings bei der Portierung mehr getan werden muß, was dann aber spezifischer und effizienter gemacht werden kann.
Die #ifdefs sollten sich in der Wrapperimplementierung sammeln, wenn nicht überhaupt systemspezifische Implementierungen in spezifischen Libraries gemacht werden.
Ich wollte mal nonblocking IO mit ACE einsetzten, was leider nicht funktioniert hat. Die Analyse der Wrapperschicht erwies sich aus sehr aufwendig, dahingegen erweis sich die POSIX API geradezu als trivial → die #ifdefs führen definitionsgemäß zu totem Codezeilen, die die Verifizierbarkeit verschlechtern.
Der Wrapper darf die Performancecharakteristiken nicht verdecken
Ein Betriebssystem wrappt über die Hardware:
Mißbrauch des Wrappermusters:
Wrappen von Standards wie POSIX oder CORBA-ORB: Die Standards sind ja schon eine wohldefinierte API