디자인패턴/델리게이션

Paikwiki
Paikwiki (토론 | 기여)님의 2020년 6월 11일 (목) 12:55 판 (참고링크 작성)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
이동: 둘러보기, 검색

델리게이션 패턴 정의[ ]

Delegation is a way to make composition as powerful for reuse as inheritance [Lie86, JZ91]. In delegation, two objects are involved in handling a request: a receiving object delegates operations to its delegate. This is analogous to subclasses deferring requests to parent classes. But with inheritance, an inherited operation can always refer to the receiving object through the this member variable in C++ and self in Smalltalk. To achieve the same effect with delegation, the receiver passes itself to the delegate to let the delegated operation refer to the receiver. - Gamma, Erich, Design patterns: elements of reusable object-oriented software (Addison-Wesley, 1995), 20.

위 정의를 번역해봤다.

델리게이션(Delegation, 위임)은 상속만큼이나 재사용가능한 구성을 만드는 강력한 방법이다[Lie86, JZ91]. 델리게이션에서는, 요청을 처리하는 데 두 객체가 참여한다. 수신하는 객체가 그의 위임자(delegate)에게 작업을 위임한다. 이는 하위 클래스가 상위 클래스에게 요청을 연기하는(deferring) 것과 유사하다. 하지만 상속을 통해 상속된 작업은 C++의 this 멤버 변수와 Smalltalk의 self를 통해 수신하는 객체를 항상 참조할 수 있다. 델리게이션은 동일한 처리를 하기 위해서, 수신자는 위임된 작업이 수신자를 참조할 수 있도록 위임자에게 스스로를 전달한다.

이해를 돕기 위해 스위프트 책에서 델리게이션 패턴에 대해 소개하는 부분을 가져왔다.

델리게이트 패턴은 쉽게 말해 객체지향 프로그래밍에서 하나의 객체가 모든 일을 처리하는 것이 아니라 처리해야 할 일 중 일부를 다른 객체에 넘기는 것을 말합니다. 이는 효율성 관점에서 아주 중요한 역할을 합니다. 기능을 위임할 수 있는 객체가 있다는 것은 그만큼 직접 구현해야 하는 부분이 적다는 뜻이기 때문에 큰 규모의 프로그램을 빠르게 작성할 수 있습니다. - 이재은, 꼼꼼한 재은 씨의 스위프트 기본편 (루비페이퍼, 2018), 418.

예시 코드[ ]

      ┌──────────┐                      ┌───────────┐
      │ Window   │                      │ Rectangle │
      ├──────────┤ rectangle            ├───────────┤
      │ Area() • ├─────────────────────▶︎│ Area() •  │
      └────────┼─┘                      ├────────┼──┤
               ┊                        │ width  ┊  │
               ┊                        │ height ┊  │
               ┊                        └────────┼──┘
               ┊                                 ┊
┌──────────────┴─────────────╮   ┌───────────────┴───────╮
│ return rectangle -> Area() │   │ return width * height │
└────────────────────────────┘   └───────────────────────┘

출처 - Gamma, Erich, Design patterns: elements of reusable object-oriented software (Addison-Wesley, 1995), 20.

영어판 위키백과의 델리게이션 패턴 문서의 예시 코드가 위의 다이어그램에 대한 코틀린 코드였다.

class Rectangle(val width: Int, val height: Int) {
fun area() = width \* height
}

class Window(val bounds: Rectangle) {
// Delegation
fun area() = bounds.area()
}

언어가 지원할 경우, 아래처럼 사용할 수 있다.

interface ClosedShape {
    fun area(): Int
}

class Rectangle(val width: Int, val height: Int) : ClosedShape {
    override fun area() = width * height
}

class Window(private val bounds: ClosedShape) : ClosedShape by bounds

위 두 코드는 영어판 위키백과의 델리게이션 패턴 문서에서 가져왔다. 코틀린을 사용해보지 않아서 마지막의 클래스 Window는 왜 본문이 없는지 모르겠다.

참고링크[ ]

마지막 편집: 2020년 6월 11일 (목) 12:55