Patrón de complemento de cacao

Tengo una arquitectura de complementos para mi aplicación de escritorio. Lo he implementado de una manera bastante estándar usando Guía de carga de código de Apple.

Tengo un solo protocolo que define todos los métodos a los que puede o debe responder una instancia del complemento.

El único problema es que este protocolo define alrededor de 80 métodos. Solo alrededor de 10 de estos métodos son obligatorios y el resto son opcionales. Algunos complementos implementarán los 80 métodos, mientras que otros solo implementarán los 10 básicos.

La forma habitual en que un paquete de complementos le dice a su aplicación host qué clase instanciar es a través de la NSPrincipalClass clave en su archivo Info.plist. Esta es una sola clave, por lo que solo se puede instanciar una sola clase.

El protocolo del complemento es un archivo único y se espera que sea utilizado por esta clase única.

Mi pregunta es: ¿cuál es la mejor manera de dividir la funcionalidad dentro de este protocolo único en quizás múltiples protocolos, mientras que al mismo tiempo permite que el escritor del complemento tenga una implementación más flexible?

Actualmente, mis complementos existentes tienen lo siguiente en su clase principal:

- (BOOL)respondsToSelector:(SEL)selector {
    return [self forwardingTargetForSelector:selector] ? YES : NO;
}

- (id)forwardingTargetForSelector:(SEL)selector {
    id target = nil;
    if ([self.instanceOne respondsToSelector:selector]) {
        target = self.instanceOne;
    } else if ([self.instanceTwo respondsToSelector:selector]) {
        target = self.instanceTwo;
    } else if ([self.instanceThree respondsToSelector:selector]) {
        target = self.instanceThree;
    }

    return target;
}

Pero en lugar de imponerle al escritor del complemento que defina un sistema ad hoc como este, me gustaría que el marco del complemento de la aplicación se adaptara a una solución más flexible.

preguntado el 12 de junio de 12 a las 11:06

1 Respuestas

Si puede dividir sus 80 métodos en partes sensibles de funcionalidad, podría dividirlos en varios protocolos (FooProtcol, BarProtocol, etc.) y defina propiedades opcionales que devuelvan referencias a objetos que las implementen en su protocolo principal. Por ejemplo:

@protocol PluginPrimaryProtocol <NSObject>
@required
/* ... */
@optional
@property (readonly) id<FooProtocol> fooDelegate;
@property (readonly) id<BarProtocol> barDelegate;
/* ... */
@end

Respondido el 12 de junio de 12 a las 13:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.