2012-07-02 5 views
8

이것은 매우 일반적인 질문이지만, 오늘 델리게이트에 대해 궁금해하고있었습니다. 이 시점에서 필자는 피커 또는 테이블 뷰 항목에서 선택 사항을 전달하는 것과 같은 명백한 경우를 제외하고는 필자가 사용하거나 사용하지 않는 특정 시간을 실제로 갖고 있지 않습니다. 예를 들어, 객체에 대한 참조를 전달하여 메소드를 호출 할 수있는 상황이 발생하면 대리인을 구현해야 할 이유가 있습니까? 요약하면, 사용을 의도 한 대리자 패턴은 무엇이며 언제 사용하지 않는 것이 더 낫습니까?델리게이트를 사용하거나 사용하지 않는 경우

신속하고 종합적인 답변을 보내 주셔서 감사합니다. 그들은 모두 매우 도움이되었습니다.

답변

4

장점의 (같은 이벤트에 대해 여러 개체를 말하는) 컨트롤러에 같은 프로토콜의 여러 대표단을 가지고 적합하지 않습니다 대리자 패턴은 위임하는 개체와 해당 대리인 간의 느슨한 결합입니다. 느슨한 결합은 다른 상황에서 클래스의 재사용 가능성을 향상시킵니다.

위임 객체는 위임 프로토콜을 구현한다는 요구 사항을 제외하고는 통신하는 객체에 대해 알 필요가 없습니다. 특히 위임 객체는 해당 클래스 나 메소드가 아닌 것입니다. 나중에 다른 컨텍스트에서 구성 요소를 재사용하거나 다른 클래스의 다른 객체와 통신하도록하려면이 객체가 수행해야하는 모든 작업은 위임 프로토콜을 구현하는 것입니다. 위임 객체는 전혀 변경 될 필요가 없습니다.

물론 여기에는 단점이 있으며, 더 많은 코드가 필요하며 작성한 코드가 명확하지 않으므로 이해하기가 더 어려울 수 있습니다. 이 (일반적으로 작은) 절충이 가치가 있는지 여부는 사용 사례에 따라 다릅니다. 어쨌든 두 객체가 밀접하게 결합되어 있고 나중에 재사용 할 가능성이 낮 으면 대리자 패턴을 사용하는 것이 과도 할 수 있습니다.

3

는 대리자가 이벤트가 발생하면 하나의 객체가 다른 객체에 메시지를 보낼 수 있습니다 this 토론을

를 참조하십시오.

프로

  • 매우 엄격한 구문. 청취 할 모든 이벤트는 위임자 프로토콜 인 에 명확하게 정의되어 있습니다.

  • 컴파일 시간 메서드가 위임자에 의해 구현되었으므로 구현되지 않은 경우의 경고/오류입니다.

  • 프로토콜은 컨트롤러의 범위 내에서만 정의됩니다.

  • 매우 추적 가능하고 응용 프로그램 내에서 제어 흐름을 쉽게 식별 할 수 있습니다.

  • 여러 대의 프로토콜이 하나의 컨트롤러를 정의하고 각각 다른 대리자를 가질 수 있습니다.

  • 통신 프로세스를 유지 관리하고 모니터링하는 데 필요한 제 3 자 객체가 없습니다.

  • 호출 된 프로토콜 방법에서 반환 된 값을받을 수있는 기능. 즉, 대표는 컨트롤러에 정보를 다시 제공 할 수 있습니다.

단점

    정의하는 데 필요한 코드
  • 행수 : 1. 프로토콜 정의 제어부 2. 대리인 등록 및 3 델리게이트 메소드 정의의 구현 대의원 자체 내에서.

  • 대리인을 개체 할당 해제시 올바르게 설정하지 않도록주의해야합니다. 그렇게하지 않으면 할당되지 않은 개체에서 메서드를 호출하여 메모리가 손상 될 수 있습니다.

  • 수 있지만, 그것은 어려울 수 있으며, 패턴은 정말

2

위임을위한 "유스 케이스"는 상속과 거의 동일합니다. 즉, 클래스 동작을 다형성 방식으로 확장합니다. 해당 작업

소프트웨어 공학에서

, 위임 패턴은 객체 지향 프로그래밍의 디자인 패턴이 어디 대신에 명시된 작업 중 하나를 수행의 목적은, 대의원 다음 wikipedia 위임을 정의하는 방법을

이입니다 연관된 도우미 객체에 연결합니다. 대리자로 알려진 도우미 객체가 위임자의 작업을 실행할 책임을 부여받는 Inversion of Responsibility가 있습니다. 위임 패턴은 구성 (집합이라고도 함), 믹스 인 및 측면과 같은 다른 소프트웨어 패턴의 기초가되는 기본 추상화 패턴 중 하나입니다.

분명히 위임 및 상속되지만, 가장 큰 일 사이에는 많은 차이가 IMO, 그 상속은 두 클래스 사이에 고정 (일명, 컴파일 시간) 관계이다 대표단 실행에가 정의 할 수있는 동안 - 시간 (이것을 지원하는 언어로). 반면에, 상속은 다형성에 대한 더 나은 지원을 제공합니다.

위임은 거대한 주제이므로 (상속이 있음) 많은 것을 읽을 수 있습니다. 결국, 위임이나 상속을 사용하는 것이 "is-a"또는 "has-a"관계를 원하는지 여부를 결정할 때 결정되므로 선택을위한 지침을 나열하는 것은 쉽지 않습니다.

  1. 내 코드가이 공통의 "성질을 가진 것으로 인식 될 수 균일 여기에 의미 균일 한 일련의 행동을 (제공 : 나를 위해

    는 기본적으로 대리자를 만들 수있는 결정은 관찰에서 온다 ");

  2. 이러한 동작은 특정 동작 (예 : 대체 동작으로 대체 됨)에 대해 "사용자 지정"될 수 있습니다.

이것은 내 개인적인 견해이며 "위임"패턴을 식별하는 방법에 대한 설명입니다. 프로그래밍 원리가 리팩토링 원리에 의해 강력하게 알려졌다는 사실과 관련이 있습니다.

정말, IMO, 위임은 클래스의 "사용자 지정"지점을 정의하는 방법입니다. 예를 들어, 어떤 종류의 추상 워크 플로가있는 경우, 각 단계에서 특정 조건에 따라 어떤 조치를 취합니다. 나아가 그러한 구체적인 행동이 다른 종류의 다른 행동으로 대체 될 수 있다면 위임을 통한 재사용의 기회를 볼 수 있습니다.

희망이 도움이됩니다.

관련 문제