ACTUALIZACIÓN:AOP en Objective-C: inyectar código sensible al contexto en cada método, manteniendo SECO
Con algunas sugerencias clave y de ida y vuelta con George, yo he llegado con dos formas diferentes de logro exactamente lo que quiero en CodeRunner y lo publicó en el sitio quid de Github: Objective-C AOP gist
El código es áspera porque es un concepto nuevo y acabo de terminar a las 1:30 de la mañana. Sin embargo, definitivamente funciona y tiene algunas sutilezas, como agregar automáticamente todos los métodos que no son inicializadores, getters o setters. [FIN DE ACTUALIZACIÓN]
Varias veces (pero ciertamente no muy a menudo) He encontrado una situación en la que mi código podría ser un poco SECO si pudiera llamar a un fragmento de código contextual para cada método en una clase . El uso del tiempo de ejecución de Objective-C es totalmente correcto, aceptaría las soluciones C o C++ también.
En lugar de:
- (void)methodName1
{
self->selector = _cmd;
NSLog(@"This method is named: %@",_cmd);
//more code
}
- (void)methodName2
{
self->selector = _cmd;
NSLog(@"This method is named: %@",_cmd);
//more code
}
tener algo como esto, con el resultado de la misma:
+ (void)AOPMethod
{
self->selector = _cmd;
NSLog(@"This method is named: %@",_cmd);
}
- (void)methodName1
{
//more code
}
- (void)methodName2
{
//more code
}
En una aplicación real, AOPMethod contendría más de código y no habría más métodos en la clase.
P.S., estoy bastante obsesionado con DRY. Junto con la claridad de la prosa y el rendimiento, es un componente clave de cómo evalúo la calidad de mi código a largo plazo. Por cada nueva forma que puedo evitar de repetirme, el beneficio es exponencial porque rompo la mayor cantidad de código posible en clases reutilizables que se comparten en muchos proyectos.
¿Está buscando intercepciones de entrada/salida? –
@GeorgFritzsche Gracias por la pregunta. Si la interceptación de un método es independiente de la plataforma y permitirá el uso de datos sensibles al contexto a nivel de método como _cmd dentro de cada método de una clase y sin duplicación de código, entonces sí. En otras palabras, si puede compartir una técnica en uno de los idiomas base mencionados (y no en los marcos no disponibles en todas las plataformas) que permitirán que alguna versión del último ejemplo tenga el mismo resultado que la anterior, entonces eso es responder. Gracias de nuevo. –
Para su caso de uso específico (todos los métodos con la misma firma) [este enfoque] (http://stackoverflow.com/questions/9242571/copy-a-method-imp-for-multiple-method-swizzles) podría ser extendido para parchar todos los métodos adecuados en la lista de métodos. Por el momento no puedo pensar en una solución elegante más general, solo ineficaz. –