2012-06-12 3 views
3

내 데스크톱 앱용 플러그인 아키텍처가 있습니다. Apple's code loading guide을 사용하여 상당히 표준 방식으로 구현했습니다.코코아 플러그인 패턴

나는 플러그인의 인스턴스가 응답 할 수 있거나 응답해야하는 모든 메소드를 정의하는 단일 프로토콜을가집니다.

이 프로토콜은 약 80 가지 방법을 정의하는 유일한 문제입니다. 이 방법들 중 약 10 가지만이 강제적이며 나머지는 선택 사항입니다. 일부 플러그인은 80 개의 메소드를 모두 구현하지만 나머지는 기본 메소드 만 구현합니다.

플러그인 번들이 호스트 애플리케이션에 어떤 클래스를 인스턴스화할지 알려주는 일반적인 방법은 Info.plist 파일의 NSPrincipalClass 키를 사용하는 것입니다. 이것은 단일 키이므로 하나의 클래스 만 인스턴스화 할 수 있습니다.

플러그인 프로토콜은 단일 파일이며이 단일 클래스에서 사용될 것으로 예상됩니다.

내 질문은 : 플러그인 작성자가보다 유연한 구현을 할 수있게하는 동시에이 단일 프로토콜 내부의 기능을 여러 프로토콜로 분할하는 가장 좋은 방법은 무엇일까요?

현재 기존 플러그인 그들의 주요 클래스 다음과 같습니다

- (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; 
} 

그러나 오히려이 같은 임시 시스템을 정의하는 플러그인 작가에게 그것을 강요보다, 내가 수용하기 위해 응용 프로그램의 플러그인 프레임 워크를 싶습니다 보다 유연한 솔루션 이 기능의 재치 덩어리로 당신의 80 개 방법을 나눌 수있는 경우

답변

1

, 여러 프로토콜 (FooProtcol, BarProtocol 등)로 그들을 분할 및 기본 프로토콜을 구현하는 객체에 대한 참조를 반환 옵션 속성을 정의 할 수 있습니다. 예 :

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