Lieber Besucher, herzlich willkommen bei: OS X Entwicklerforum. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.
Das geht in Richtung aspekt-orientierte Entwicklung. Amin hat auf seinem Macoun-Vortrag 2009 gezeigt, wie sich sowas umsetzen lässt. Wenn Dir das zuviel Aufwand ist, böte sich auch noch das Action-Target-Pattern an. Noch universeller lässt es sich wahrscheinlich über ein Proxy und NSInvocation umsetzen. Ein Beispiel dazu findest Du hier.
Es spricht aber auch nichts dagegen, das Decorator-Pattern zu verwenden. Apple setzt es ja auch ein: https://developer.apple.com/library/ios/…002974-CH6-SW43
Ich empfinde das Decorator-Pattern eigentlich als die undynamischste Lösung, weil da ja alles hardcoded ist![]()
Der Decorator funktioniert nur mit der run-Methode. AOP oder eine Proxy-Lösung kannst Du beliebige Methoden anwenden.
Wir reden mal wieder über unterschiedliche Dinge. Tschüss.
Will ja eine reine Erweiterung des bestehenden Codes haben indem ich vor der Ausführung von run() allen Interessierten ein preRun() sende und danach ein postRun().
|
|
C/C++-Quelltext |
1 2 3 4 5 6 |
-(void) myRunMethod { [myApplicationDoingRunStuffNotificationCenter postNotificationName:@"runMethodWillStartNotification" object:self]; // Deine Implementierung der Run-Methode [myApplicationDoingRunStuffNotificationCenter postNotificationName:@"runMethodDidEndNotification" object:self]; } |
Der Einsatz eines Proxies leuchtet mir zunächst nicht ein, da ich kein Objekt brauche welches eine Stellvertreterfunktion einnimmt solange das Originalobjekt nicht verfügbar ist. Will ja eine reine Erweiterung des bestehenden Codes haben indem ich vor der Ausführung von run() allen Interessierten ein preRun() sende und danach ein postRun().
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@interface LoggingProxy
@property (nontatomic, strong) id target;
@end
@implementation LoggingProxy
@synthesize target;
- (id)forwardInvocation:(NSInvocation *)inInvocation {
NSLog(@"start %@", NSStringFromSelector(inInvocation.selector);
[inInvocation invokeWithTarget:self.target];
NSLog(@"end %@", NSStringFromSelector(inInvocation.selector);
}
|
|
|
Quellcode |
1 2 3 |
id theProxy = [[LoggingProxy alloc] init]; theProxy.target = ...; [theProxy run]; |
Ich finde den Ansatz mit der AOP sehr gut und es würde sicherlich mein Problem lösen - aber Ihr habt wahrscheinlich Recht dass es etwas zu viel des Guten ist. Auf jeden Fall ein sehr interessanter und unterhaltsamer Vortrag.
Mit Vererbung (mag es gerne in Deutsch - also nicht nötig es Inheritance zu nennen ;-)) geht es natürlich auch. Aber: der Code bleibt leserlicher und ist einfacher testbar wenn ich das Objekt - welches in seiner Funktionalität erweitert werden soll - dekoriere anstatt es über Vererbung zu lösen. So meine bisherige Erfahrung -> allerdings in anderen Sprachen.
Der Einsatz eines Proxies leuchtet mir zunächst nicht ein, da ich kein Objekt brauche welches eine Stellvertreterfunktion einnimmt solange das Originalobjekt nicht verfügbar ist. Will ja eine reine Erweiterung des bestehenden Codes haben indem ich vor der Ausführung von run() allen Interessierten ein preRun() sende und danach ein postRun().
AOP umgesetzt mit Proxies: http://blog.jayway.com/2009/03/06/proxy-…for-cocoa-touch
Vielleicht doch der richtige Weg - auch wenn ich's noch nicht wirklich verstehe.
Der Einsatz eines Proxies leuchtet mir zunächst nicht ein, da ich kein Objekt brauche welches eine Stellvertreterfunktion einnimmt solange das Originalobjekt nicht verfügbar ist. Will ja eine reine Erweiterung des bestehenden Codes haben indem ich vor der Ausführung von run() allen Interessierten ein preRun() sende und danach ein postRun().
Ein Proxy sind relativ einfach zu basteln. Ohne Auswertung des Returnwertes geht es ungefähr so:
![]()
Quellcode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15@interface LoggingProxy @property (nontatomic, strong) id target; @end @implementation LoggingProxy @synthesize target; - (id)forwardInvocation:(NSInvocation *)inInvocation { NSLog(@"start %@", NSStringFromSelector(inInvocation.selector); [inInvocation invokeWithTarget:self.target]; NSLog(@"end %@", NSStringFromSelector(inInvocation.selector); }
Das kannst Du dann beispielsweise so verwenden:
![]()
Quellcode
1 2 3 id theProxy = [[LoggingProxy alloc] init]; theProxy.target = ...; [theProxy run];