Performance klassischer Patterns und Polymorphie

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Benutzeravatar
dv
Beiträge: 51
Registriert: 15.09.2002, 17:46
Benutzertext: Ugauga.
Alter Benutzername: dv
Wohnort: Südamerikanischer Dschungel
Kontaktdaten:

Re: Performance klassischer Patterns und Polymorphie

Beitrag von dv »

Natürlich sind auch Methodenzeiger möglich. Es müssen auch keine statischen Methoden sein - man muss nur den Pointer auf das Objekt mitliefern.

An dieser Stelle ist es wichtig, sich mal function objects anzusehen, implementiert in boost.function und tr1 function. Zusammen mit tr1 bind, boost lambda bind, oder boost phoenix bind ein extremst mächtiges Werkzeug. Beispiel:

Code: Alles auswählen

void foo(int x, float y) {}
class X { void bar(string const &str, int i) {} };
class Functor { typedef int result_type;   int operator()(float x) { return 42; } };

X x;
Functor functor;
function < void(int a, float b) > funcobj1 = bind(&foo, _1, _2);
funcobj1(5, 6); // ruft foo(5, 6) auf

function < void(string const &str, int i) > funcobj2 = bind(&X::bar, &x, _1, _2);
funcobj2("hello world", 1); // ruft x.bar("hello world", 1) auf

function < void(int i) > funcobj3 = bind(&X::bar, &x, "somefixedvalue", _1); // der 1. Parameter wird quasi fixiert; analog zum "Currying" bei funktionalen Sprachen
funcobj3(11); // ruft x.bar("somefixedvalue", 11) auf

function < int(float f) > funcobj4 = bind(&functor, _1);
funcobj4(4.1f); // ruft functor(4.1f) auf
_1 und _2 sind Platzhalter für Parameter (bei phoenix heissen sie arg1 und arg2). function < > sind Function Objects. Wie man sieht, stellen sie eine generische Lösung zur Referenzierung auf Funktionen bzw. Funktoren dar. bind() gibt ein Function Object zurück.

Auf dieser Basis gestellt, werden signals deutlich einfacher. Hier ein boost.signals2 Beispiel:

Code: Alles auswählen

void foo(string const &str) { cout << str << endl; }
struct X { void bar(string const &str) { cout << str << endl; } };

X x;
signal < void(string const &somestr) > mysignal;
mysignal.connect(bind(&foo, _1));
mysignal.connect(bind(&X::bar, &x, _1));

mysignal("Hello world");
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

Re: Performance klassischer Patterns und Polymorphie

Beitrag von Eisflamme »

Okay, jetzt verstehe ich. Dann ist das super :)

Hat jemand noch Antworten auf meine anderen Frage zum Vergleich der vererbungsbedingten Loesung vs. der signal-Loesung?
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4321
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Performance klassischer Patterns und Polymorphie

Beitrag von Chromanoid »

Naja bei Java benutzt man bei Listenern ja nicht selten anonyme Klassen. Und an sich ist das mit Interfaces dann doch recht viel Schreibarbeit.
Wenn man Closures/Signals/Delegates benutzt, kann man sich viel Schreibarbeit sparen und mehrere Subjekte, die die gleichen Listener brauchen, auch ohne anonyme Klassen o.Ä. durch eine einzige Klasse leicht abhören.
Man könnte zwar über einen Sender-Parameter die Verarbeitung durch eine einzige Listener-Funktion ermöglichen, aber mit delegates/signals/closures ist das gar nicht nötig, weil es durch mehrere Listener-Funktionen für unterschiedliche Subjekte übersichtlicher wird und leicht machbar ist.
Arbeitet man in Java mit Swing und benutzt den GUI Editor Matisse aus Netbeans, wird dieses Verhalten übrigens simuliert, indem automatisch für Listener (zum Beispiel ActionListener) eine anonyme Listener-Klasse im GUI Code generiert wird, die dann eine Funktion der Container-Klasse aufgeruft. Als Entwickler hat man es dann also nur mit diesen Funktionen in der Container-Klasse zu tun für deren Ausführung durch die generierten anonymen Klassen gesorgt wird. Dies sorgt für Übersicht und einfache Handhabe und wäre mit Delegates/Signals/Closures durch wesentlich weniger generierten Code möglich...
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

Re: Performance klassischer Patterns und Polymorphie

Beitrag von Eisflamme »

Ok, also die klassenträchtige Variante nur die am einfachsten zu verstehende, die mit Eclipse ohne Extrazeug klappt und daher wird die allen gezeigt und im GoF-Buch so breit getreten (hab's nie gelesen) :) Sehr gut, dann auf zu Signals!
Antworten