2012-11-27 3 views
3

나는 재사용 가능한 코드의 간단한 세트를 개발 중이다. 나는 일련의 메소드를 그룹화하고 런타임에 사용자에게 데이터를 요청하는 프로토콜을 만들었습니다.개발자가 객관적인 C의 프로토콜을 따르도록하는 것이 좋은 습관입니까?

위임자를 설정하는 것이 필수적이라고 생각합니다. 이유를 설명하는 어설 션을 던져 개발자가 런타임에 강제로 위임자를 설정할 수 있습니까?

어설 션을 사용하여 클래스의 사용자를 강제 적용하는 것이 좋습니까? 디자인 수준의 결함이 있습니까?

+3

어떤 이유와 관련없는 클래스들 사이의 유사성을 캡처하려면 해당 클래스를 은폐하면서 객체에 대한 인터페이스를 선언하려면

  • 를 구현할 것으로 예상된다 메소드를 선언하려면 downvote? – Krishnan

  • +1

    좋은 읽기 : http://mattgemmell.com/2012/05/24/api-design/ – vikingosegundo

    +0

    고마워요 @vikingosegundo 그건 매우 유용한 링크였습니다 – Krishnan

    답변

    5

    먼저 "좋은 연습"질문 : 실제로하지 않는 한

    • 가 필요한 방법을하지 마십시오.
    • 그렇지 않은 경우 옵션을 선택하지 마십시오. 대리인은 내가 있다는 것을 모르는 곳 나는 종종 데이터 구조 건너

    • 필요 경우

    • 아니 중요 하나, 의견

      • 더는 방법 initWithDelegate: 제공 조사 할 때까지 위임 패턴. 특정 init 메서드를 사용하면 이전에이를 알게되었습니다.

    당신은 단순히 당신의 프로토콜에 @required 지표를 추가하여 컴파일시 경고가 발생할 수 있습니다 예

    if (!delegate || ![delegate respondsToSelector:@selector(requiredMethod1)]) 
    { 
        //Assertion failure 
    } 
    
    +0

    나는 @required를 사용하고 있다는 것을 알고있었습니다. 하지만 내 경우에는 선택 사항으로 모든 방법이 있습니다. – Krishnan

    +0

    어설 션 오류 확인을위한 +1 .. – Krishnan

    +1

    "우수 사례"에 대한 참조로 추가했습니다. –

    1

    I :

    @protocol SuperAwesomeProtocol <NSObject> 
    
    @required 
    -(void) requiredMethod1; 
    -(void) requiredMethod2; 
    
    @optional 
    -(void) optionalMethod1; 
    -(void) optionalMethod2; 
    
    @end 
    
    //and making your delegate specific: 
    @property (nonatomic, assign) id<SuperAwesomeProtocol> delegate; 
    

    당신은 여전히 ​​발생할 수 런타임과 주장 응용 프로그램에서 프로토콜을 사용하는 것이 좋습니다.

    프로토콜은 모든 클래스에서 구현할 수있는 메서드를 선언합니다.

    다음은 프로토콜 사용이 양호한 상황입니다.

    1. 다른 사람이
    2. 계층 적
    +0

    내 질문은 프로토콜을 사용하는 것이 아니라 내 클래스 (개발자)가 사용자가 대리인을 제공하지 않은 경우 어설 션을 사용하여 델리게이트를 제공하도록 강제하는 데 있습니다. – Krishnan

    관련 문제