Delegation (Softwareentwicklung)
Delegation (von englisch delegation ‚Abordnung‘, ‚Übertragung‘) hat in der objektorientierten Programmierung verschiedene Bedeutungen, die alle mit dynamischer Methodenbindung zur Programmlaufzeit zu tun haben:
- insbesondere in .NET-Sprachen wie C# eine objektorientierte Variante von Methodenzeigern.[1]
- objektbasierte Vererbung (im Gegensatz zur üblichen klassenbasierten Vererbung). Hierbei übernimmt ein Objekt (automatisch) Eigenschaften und Funktionalitäten, die es selbst nicht explizit definiert, von einem anderen konkreten Objekt, seinem Prototyp[2][3].
- ursprünglich die Implementierung von Methoden eines Objekts durch Aufruf äquivalenter Methoden eines anderen Objekts, auch englisch consultation (für Absprache, Beratung) oder invocation (Aufruf) genannt.[4] Diese Variante passt zu den Entwurfsmustern Proxy und Adapter.
- Die Sprache Objective-C kennt das Schlüsselwort delegate als Funktionalitätsspezialisierung: Hier kann ein Objekt zur Laufzeit nach einer beliebigen Funktionalität (Methode) befragt werden. Diese wird dann im Kontext des fragenden Objekts eventuell ausgeführt, als sei sie Teil des fragenden Objekts.
Hintergrund
Im Bereich der objektorientierten Programmierung kann in manchen Fällen durch Vererbung oder gängige Beziehungsarten wie die Interaktion oder Aggregation keine zufriedenstellende Trennung von Dienstanbieter und -nutzer garantiert werden.[5] Alle zuvor genannten Konzepte erfordern eine Bindung schon vor der Laufzeit. Wird der Dienstanbieter verändert, können die Nutzer diesen unter Umständen nicht mehr nutzen, da sie seine Schnittstellen nicht mehr verstehen. Die Delegation bietet in solchen Fällen eine für die Nutzer konstante Schnittstelle und delegiert die Aufrufe an eine darunter liegende Schicht. In der Informatik wird dieses unter anderem in der Forschung zur Künstlichen Intelligenz seit langem verwendet.
Als Entwurfsmuster
In den Entwurfsmustern der Gang of Four (engl. für Viererbande) wird statt des allgemeinen Delegate vom Proxy oder dem Adapter gesprochen. Im Allgemeinen kennt der Nutzer eines Dienstes nur die Schnittstelle zu einem Vertreter der Diensterbringung und das Protokoll, d. h. wie die Schnittstelle benutzt werden muss. Der Vertreter verbirgt die Diensterbringung hinter mehr oder weniger dynamischen Verfahren zur Ermittlung eines konkreten Dienstleisters. Eine Aufbereitung der übergebenen Daten ist möglich. Außerdem kann der Vertreter Fehler- und Ausnahmesituationen erkennen und sogar geeignete Maßnahmen wie die Auswahl von Alternativen der Delegation bieten.
Als Sprachelement
Die einfache Definition der Delegation ist, dass die Funktionsaufrufe das identische Verhalten wie virtuelle Funktionsaufrufe aufweisen, es wird immer die am meisten spezifizierte Funktion aufgerufen. Respektive ist es die Originalfunktion, welche den Anfang des sogenannten lookups (engl. für „Nachschlag“) darstellt, selbst wenn es die Kontrolle einem anderen Objekt übertragen hat. Die Delegation besitzt den Vorteil, dass sie zur Laufzeit erfolgen kann. Sie kann auch während der Laufzeit wieder rückgängig gemacht werden. Die Vererbung könnte auch Funktionsaufrufe derart zusammenfassen, zielt auf den Typ einer Entität und ist auf die Kompilierungszeit beschränkt. Der Nachteil der Delegation ist, dass sie nicht vollständig als typsicher betrachtet werden kann (G. Kniesel zeigte allerdings, dass eine beschränkte Version typsicher sein kann). Die Delegation kann auch als „Laufzeitvererbung für spezifische Objekte“ bezeichnet werden.
Programmiersprachen unterstützen normalerweise das Konzept der Delegation nicht, allerdings existieren ein paar Ausnahmen: ECMAScript, Self, G. Kniesels Lava[6], sowie das Tcl Objektsystem Snit. Lava benutzt einen expliziten Delegationslink, welcher nie null sein kann und sich nie während der Lebenszeit eines Objektes ändert. Self besitzt das Sprachelement der expliziten parent slots, welche sich zur Laufzeit verändern können. Da viele parent slots vorhanden sind, besitzt Self grundsätzlich die Fähigkeit der mehrfachen Vererbung. Die Delegation in Self wird durch das Sprachelement mutable parent slots realisiert. Dieses Konzept wird in einer Reihe von Arbeiten in der Literatur über objektorientierter Systementwicklung erläutert, allerdings ist zu beachten, dass keine einheitliche Terminologie existiert. Wie auch bei der unten beschriebenen dualen Vererbung bedarf es eines sorgsam entworfenen Funktions-lookup Schemas.
Duale Vererbung
Wenn die Programmiersprache die Delegation und die Vererbung unterstützt, kann man die duale Vererbung einsetzen, indem man beide Mechanismen gleichzeitig benutzt[7]:
class C extends A
{
delegationlink D d
}
In diesem Beispiel sind zusätzliche Regeln bezüglich des lookup der Funktionen nötig, da zwei Funktionen als potentiell am meisten spezifiziert bezeichnet werden können. Dies wird in K. Graversens Promovierungsthese bezüglich Regeln ausgearbeitet.
Verwandte Bereiche
Delegation kann als low-level Mechanismus beschrieben werden, welcher dazu dient, Code zwischen zwei Entitäten auszutauschen. Insbesondere objektorientierte Programmiersprachen benutzen die Delegation. Vornehmlich ältere Programmiersprachen geben an, Delegation zu beherrschen, obwohl sie faktisch die Aggregation umsetzen, was mit den unterschiedlichen Definitionen der Delegation zusammenhängt.
Seit neuerer Zeit wird die Forschung zu verteilter Delegation im Bereich der Suchmaschinen betrieben. Clients einer Suchmaschine benutzen eine verteilte Entität, welche die besten Suchergebnisse sowie allgemeine, wiederbenutzbare Funktionalität zur Verfügung stellt.
Die Delegation wurde als Lösungsansatz in der aspektorientierten Programmierung von Ernst und Lorenz im Jahr 2003 vorgeschlagen.
Die Delegation stellt in prototypenbasierten Programmiersprachen wie JavaScript eine fundamentale Programmiertechnik dar.
Siehe auch
- Delegate (CLI)
- Adapter (Entwurfsmuster)
- Hook (Informatik)
- Liskovsches Substitutionsprinzip
- Wrapper (Software)
Weblinks
- The Darwin Project – Die Lava Programmiersprache und allgemeine Artikel über die Delegation
- Schnelle Delegate in C++
- Eine neue Art Delegate in C++ zu implementieren
- PerfectJPattern Open Source Project – stellt eine wiederbenutzbare Java-implementation von Delegaten zur Verfügung
Einzelnachweise
- ↑ Dirk Louis und Shinja Strasser, Microsoft Visual C# 2008 – Das Entwicklerbuch, Microsoft Press Deutschland, 2008, ISBN 978-3-86645-507-8, Kapitel Delegaten und Ereignisse
- ↑ Henry Lieberman, Using Prototypical Objects to Implement Shared Behavior in Object Oriented Systems, in: OOPSLA, 1986, S. 214–223.
- ↑ Günter Kniesel,Type-Safe Delegation for Run-Time Component Adaption ( vom 12. Dezember 2013 im Internet Archive) (PDF; 72 kB), ECOOP '99 Proceedings of the 13th European Conference on Object-Oriented Programming, Springer-Verlag London, 1999, table of contents ISBN 3-540-66156-5.
- ↑ Zur begrifflichen Abgrenzung sieheDarwin Projekt – What is (Not) Delegation ( vom 13. Februar 2013 im Internet Archive), Uni Bonn (englisch)
- ↑ Ulrich Frank und Sören Halter, "Delegation: Eine sinnvolle Ergänzung gängiger objektorientierter Modellierungskonzepte (PDF; 147 kB)", Informationssystem-Architektur. Rundbrief des GI-Fachausschusses 5.2, 3. Jg., Heft 1, Sept. 1996, S. 16–19.
- ↑ Lava ( vom 29. Mai 2009 im Internet Archive), Uni Bonn
- ↑ K. B. Graversen, and K. Østerbye,“Implementation of a Role Language for Object-Specific Dynamic Separation of Concerns” ( des vom 21. November 2008 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis. (PDF; 405 kB), AOSD Workshop SPLAT: Software engineering Properties of Languages for Aspect Technologies, March 2003.