UPDATE:
Mit einigen wichtigen Anregungen und hin und her mit George, ich habe zwei verschiedene Möglichkeiten, um genau zu erreichen, was ich in Coderunner will und veröffentlichte es auf Github des Kern-Website: Objective-C AOP Kern
Der Code ist grob, weil es ein neues Konzept ist und ich gerade erst um 1:30 Uhr fertig bin. Es funktioniert auf jeden Fall aber und hat einige Feinheiten wie Auto-Addition aller Methoden, die nicht initializers, Getter oder Setter. [END UPDATE]
Einige Male (aber sicher nicht sehr oft) Ich habe auf eine Situation kommen, wo mein Code ein bisschen Dryer wäre, wenn ich ein kontextsensitives Stück Code für jede Methode in einer Klasse nennen könnte. Die Verwendung der Objective-C-Laufzeit ist völlig in Ordnung, ich würde auch C- oder C ++ - Lösungen akzeptieren.
Anstelle von:
%Vor%Haben Sie so etwas, und das Ergebnis ist dasselbe:
%Vor%In einer realen Anwendung würde AOPMethod mehr Code enthalten und es würde mehr Methoden in der Klasse sein.
P. S., ich bin ziemlich besessen von DRY. Zusammen mit der Klarheit der Prosa und der Leistung ist es eine Schlüsselkomponente dafür, wie ich die Qualität meines Codes auf lange Sicht einschätze. Für jeden neuen Weg, um mich ich vermeiden kann wiederholen, ist der Nutzen exponentiell, weil ich so viel Code wie möglich in Mehrweg Klassen abbrechen, die sich über viele Projekte gemeinsam genutzt werden.
Für den spezifischen Anwendungsfall in der Frage könnte man einen Handler bereitstellen, der die ursprünglichen Implementierungsfunktionen ersetzt und Aufrufe vor / nach Handlern sowie die ursprünglichen Funktionen mit Hilfe von etwa dieser ansatz . Im Allgemeinen funktioniert das Patchen der Methodenimplementierung jedoch nicht, da für jede abgefangene Methodensignatur eine Handler / Interception-Methode bereitgestellt werden müsste.
Was allgemeiner (d. h. für alles außer Variablenargumentfunktionen) funktionieren würde, wäre die Behandlung von -forwardInvocation:
. Das Problem hier ist jedoch, dass wir diese Methode zuerst aufrufen müssen. Da wir Methoden in ObjC2 nicht entfernen können, kann das nicht vor Ort gemacht werden.
Was jedoch getan werden kann, sind Proxies, die forwardInvocation:
implementieren und unsere Vorher / Nachher-Handler aufrufen.
Da wir die tatsächliche Instanz nicht von einer init
-Methode zurückgeben müssen, könnte dies sogar transparent erfolgen:
Jetzt der folgende Code:
%Vor%... wird gedruckt:
forwardInvocation für: someFunction
vor einigenFunktionen eine Funktion namens
nach einigerFunktion
Eine ausführbare Probe kann in diesem Kern gefunden werden.
Tags und Links c objective-c c++ dry aop