Wikipedia · einfach zusammengefasst · Stand
Delegation (Softwareentwicklung)
Delegation (Softwareentwicklung) dynamischer Methodenbindung zur Programmlaufzeit, In der Informatik wird dieses unter anderem in der Forschung zur Künstlichen …
Inhalt5 Abschnitte
Begriff und Bedeutung
Delegation bezeichnet in der objektorientierten Programmierung mehrere verwandte Verfahren, die auf dynamischer Methodenbindung zur Programmlaufzeit beruhen. Ihr gemeinsamer Kern ist, dass ein Objekt Aufgaben oder Methodenaufrufe an ein anderes Objekt überträgt.
Der Begriff kann insbesondere Folgendes bedeuten:
• In .NET-Sprachen wie C# ist ein Delegate eine objektorientierte Variante eines Methodenzeigers.
• Bei objektbasierter Vererbung übernimmt ein Objekt automatisch Eigenschaften und Funktionen, die es nicht selbst definiert hat, von einem konkreten anderen Objekt, seinem Prototyp. Dies unterscheidet sich von der üblichen klassenbasierten Vererbung.
• In der ursprünglichen Bedeutung implementiert ein Objekt seine Methoden, indem es gleichwertige Methoden eines anderen Objekts aufruft. Diese Form wird auch consultation oder invocation genannt und entspricht den Grundideen der Entwurfsmuster Proxy und Adapter.
• In Objective-C dient das Schlüsselwort delegate der Spezialisierung von Funktionalität. Ein Objekt kann zur Laufzeit nach einer beliebigen Methode gefragt werden. Diese kann dann im Kontext des fragenden Objekts ausgeführt werden, als wäre sie ein Teil dieses Objekts.
Zweck und vermittelnde Schnittstelle
Vererbung sowie Beziehungen wie Interaktion oder Aggregation können Dienstanbieter und Dienstnutzer nicht immer ausreichend voneinander trennen. Diese Konzepte verlangen eine Bindung bereits vor der Laufzeit. Wird ein Dienstanbieter verändert, können seine bisherigen Nutzer unter Umständen nicht mehr mit ihm arbeiten, weil sie seine Schnittstellen nicht mehr verstehen.
Delegation kann den Nutzern dagegen eine konstante Schnittstelle anbieten. Eingehende Aufrufe werden über diese Schnittstelle an eine darunter liegende Schicht weitergegeben. Dadurch kann die konkrete Diensterbringung hinter einem vermittelnden Objekt verborgen bleiben. Ein solches Verfahren wird in der Informatik unter anderem seit Langem in der Forschung zur Künstlichen Intelligenz eingesetzt.
Delegation als Entwurfsmuster
In den Entwurfsmustern der Gang of Four wird anstelle des allgemeinen Begriffs Delegate von Proxy oder Adapter gesprochen. Der Nutzer eines Dienstes kennt dabei normalerweise nur die Schnittstelle eines Vertreters der Diensterbringung sowie das Protokoll, also die Regeln für die Benutzung dieser Schnittstelle.
Der Vertreter ermittelt mit mehr oder weniger dynamischen Verfahren einen konkreten Dienstleister und verbirgt diesen vor dem Nutzer. Er kann die übergebenen Daten vor der Weiterleitung aufbereiten. Außerdem kann er Fehler und Ausnahmen erkennen und geeignete Maßnahmen treffen, beispielsweise eine alternative Delegation auswählen.
Delegation als Sprachelement
Bei Delegation verhalten sich Funktionsaufrufe wie virtuelle Funktionsaufrufe: Es wird stets die am meisten spezifizierte Funktion aufgerufen. Die ursprüngliche Funktion bleibt der Ausgangspunkt des sogenannten Lookups, also der Suche nach der aufzurufenden Funktion, selbst wenn sie die Kontrolle an ein anderes Objekt übertragen hat.
Ein wesentlicher Vorteil besteht darin, dass Delegation zur Laufzeit eingerichtet und auch wieder rückgängig gemacht werden kann. Vererbung kann Funktionsaufrufe ebenfalls zusammenfassen, bezieht sich aber auf den Typ einer Entität und ist auf die Kompilierungszeit beschränkt. Delegation lässt sich deshalb als „Laufzeitvererbung für spezifische Objekte“ beschreiben. Als Nachteil gilt, dass sie nicht vollständig typsicher ist. G. Kniesel zeigte allerdings, dass eine beschränkte Variante typsicher sein kann.
Die meisten Programmiersprachen unterstützen Delegation nicht unmittelbar. Ausnahmen sind ECMAScript, Self, G. Kniesels Lava und das Tcl-Objektsystem Snit. Lava verwendet einen ausdrücklichen Delegationslink, der niemals null sein kann und sich während der gesamten Lebenszeit eines Objekts nicht verändert. Self besitzt explizite parent slots, die zur Laufzeit verändert werden können. Mehrere parent slots ermöglichen grundsätzlich mehrfache Vererbung; die Delegation wird in Self durch mutable parent slots umgesetzt.
Für diese Verfahren gibt es keine einheitliche Terminologie. Außerdem muss das Schema für den Funktions-Lookup sorgfältig entworfen werden, damit eindeutig feststeht, welche Funktion aufgerufen wird.
Duale Vererbung und verwandte Anwendungen
Unterstützt eine Programmiersprache sowohl Vererbung als auch Delegation, können beide als duale Vererbung gleichzeitig eingesetzt werden. Eine Klasse C kann beispielsweise die Klasse A erweitern und zusätzlich über einen Delegationslink mit einem Objekt d des Typs D verbunden sein. Dafür sind weitere Lookup-Regeln erforderlich, weil zwei Funktionen gleichzeitig als möglicherweise am meisten spezifiziert gelten können. Regeln für diesen Fall wurden in K. Graversens Promovierungsthese ausgearbeitet.
Delegation kann allgemein als Low-Level-Mechanismus zum Austausch von Code zwischen zwei Entitäten verstanden werden und wird besonders in objektorientierten Programmiersprachen eingesetzt. Einige ältere Sprachen geben an, Delegation zu unterstützen, setzen tatsächlich aber Aggregation um. Diese Abweichung hängt mit den unterschiedlichen Definitionen von Delegation zusammen.
Weitere Einsatz- und Forschungsbereiche sind die verteilte Delegation bei Suchmaschinen, bei der Clients eine verteilte Entität für die besten Suchergebnisse und für allgemein wiederverwendbare Funktionen nutzen, sowie die aspektorientierte Programmierung. Für Letztere schlugen Ernst und Lorenz Delegation im Jahr 2003 als Lösungsansatz vor. In prototypenbasierten Programmiersprachen wie JavaScript ist Delegation eine fundamentale Programmiertechnik.