2013-05-21 2 views
0

사용 :나는이 같은 프로토콜이 청소 위임 패턴

#import <Foundation/Foundation.h> 

@protocol StoreDisplayerDelegate <NSObject> 

-(void) changeActionForObjectWithId:(NSString *)objectID ; 

@end 

을하고 난 (같은 클래스의) 선행 프로토콜 StoreDisplayerDelegate

@interface ShelfVC : UIViewController :<StoreDisplayerDelegate> 
.... 

@implementation ShelfVC 
... 

- (void)viewDidLoad { 

    ... 
    DownloadManager *manager = [DownloadManager sharedInstance]; 
    [manager setStoreDisplayerDelegate:self]; 
    .... 
} 

#pragma mark StoreDisplayerDelegate methods 
-(void) changeActionForObjectWithId:(NSString *)objectID { 
    ...... 
} 

@end 

그리고 내 코드에 부합와 callass이 때로는 대리자 메서드를 호출하여 저와 같은 형식을 취할 수 있습니다. 예를 들면 다음과 같습니다.

- (void)anOtherMethod{ 
    [self changeActionForObjectWithId:nil]; 
} 

내 퀘스트 ion 1. is : 객체가 다른 객체의 위임자 인 경우 다른 객체 (위자는 참조가 있음) 만 호출 한 위임자가 구현 한 메서드입니까?

  1. 내가 청소를하고 나하고 무엇을 : 나는 내가 메도 changeActionForObjectWithId:가 바로 다운로드 관리자에 의해 호출한다 보여 주었다 코드의 예를 들어,이 뜻이나 나는이 같은 내 클래스의 inernal에서 사용할 수 있습니다 대리인 패턴을 사용하는 나쁜 설계?

분명합니다.

답변

0

내 프로젝트에서 나는 다른 목적으로 같은 상황에 처해있다. 제 생각에는 대리자 메서드는 다른 메서드에 의해서만 호출되어야합니다.

대리자 메서드에서 특정 작업을 수행해야하는 경우 작업 수행을위한 다른 개인 메서드를 만들어 대리자 메서드에서 호출하는 것이 좋습니다.

몇 가지 예입니다. 대신이 일을 :

- (void)anOtherMethod { 
    [self changeActionForObjectWithId:nil]; 
} 

- (void)changeActionForObjectWithId:(NSString *)objectID { 
    < some actions > 
} 

을 나는이 작업을 수행 :

- (void)privateMethod{ 
    < some actions > 
} 

- (void)anOtherMethod { 
    [self privateMethod]; 
} 

- (void)changeActionForObjectWithId:(NSString *)objectID { 
    [self privateMethod]; 
} 

왜 이렇게? 델리게이트 메소드를 기본 객체의 "확장"으로 생각해야하기 때문에 : "changeActionForObjectWithId"를 삭제하면 (예를 들어, 리팩토링 후에 위임자가 더 이상 필요하지 않음) 코드가 계속 작동합니다 .

0

대리인은 개체가 특정 작업을 수행 할 수 있도록하는 프로토콜입니다. 당신의 예에서

는 :

@interface ShelfVC : UIViewController : <StoreDisplayerDelegate> 

이있는 UIViewController는 StoreDisplayerDelegate 프로토콜의 몇 가지 방법을 구현하는 것입니다 컴파일러를 알려줍니다. StoreDisplayerDelegate에 적용 할 수있는 객체가 대리자 메서드의 프로토콜에 따라 어떻게 달라질 것입니다.

0

위임자 및 프로토콜과 약간 혼란스러워합니다. 델리게이트는 프로토콜을 사용하는 디자인 패턴입니다. 프로토콜은 다른 (비 특이) 클래스에 의해 구현 될 것으로 예상되는 메서드와 속성 만 정의합니다. 이 메소드/속성이 액세스되는 곳은 중요하지 않습니다.

1

대리자 메서드 이름이 명령처럼 들립니다.당신의 StoreDisplayer 뭔가를 할 대리자를 말하고있다처럼

-(void)changeActionForObjectWithId:(NSString *)objectID;

는 소리가 난다. ViewController 내에서 해당 메서드를 호출하려는 유혹을 받는다는 사실 또한이를 확인합니다.

위임 패턴이 아닙니다. 위임자 패턴은 클래스가 위임자에게 변경 사항을 알리거나 위임자에게 몇 가지 정보를 요청하는 것입니다. 위임 클래스 (StoreDisplayer?)는 특정 대리자의 역할에 대해 알지 않아야하므로 특정 명령을 직접 전달할 수 없어야합니다. 일반적인 동작 만 위임하십시오.

위임 방법은 더이 예제처럼 :

-(BOOL)actionShouldChangeForStoreDisplayer:(StoreDisplayer*)storeDisplayer; 
-(void)actionWillChangeForStoreDisplayer:(StoreDisplayer*)storeDisplayer objectId:(NSString *)objectId; 
-(void)actionDidChangeForStoreDisplayer:(StoreDisplayer*)storeDisplayer objectId:(NSString *)objectId; 

나는 사람들은 당신이 필요로하는 무엇을 말하는 게 아니에요,하지만 그들은 당신에게 아이디어를 줄 것이다.

대리자 메서드가 이와 같이 보이면 위임을 수행하는 클래스 (StoreDisplayer) 이외의 다른 메서드에서 호출하지 않아도됩니다.

+0

답변 해 주셔서 감사합니다. 하지만 다른 peopole 코드에서 예를 들어 호출 - (UITableViewCell *) tableView : (UITableView *) tableView cellForRowAtIndexPath : (NSIndexPath *) indexPath 데이터 원본 메서드를, 그리고 그것은 내 상황과 동일하다고 생각합니다. ? – samir

+0

"위임자에게 몇 가지 정보를 요청하십시오"라는 범주에 해당합니다. 그리고'UITableView * '를 전달한다는 것을 알 수 있습니다. 'StoreDisplayer * '를 넘기고 있지 않습니다. "하지만 StoreDisplayer에 대한 포인터가 필요 없습니다"라고 생각할 수도 있습니다. 하지만 그때 당신은 그 패턴을 따르지 않고 있습니다. 그리고 당신의 질문은 훌륭한 디자인에 대한 것이 었으며 대의원 패턴을 따른 것입니다. –

+0

답장을 보내 주셔서 감사 드리며 @ marco의 답변에 대해 어떻게 생각하십니까? 나는 마녀 대답이 정확하고 그것을 받아들이는지 모른다 : 미안하다. – samir