SmalltalkBestPracticePatterns:7.9

From 흡혈양파의 번역工房
Jump to: navigation, search
7.9 Cascade

Cascade

다수의 메시지를 어떻게 동일한 수신자로 포맷팅하는가?


가장 간단한 해결책은 수신자를 생성한 표현식을 반복하는 방법으로, 그 코드는 아래와 같은 모습을 한다:

self listPane parent color: Color black.
self listPane parent height: 17.
self listPane parent width: 11.


복합 표현식의 경우 첫 번째 간소화는 Explaining Temporary Variable(설명하는 임시 변수)을 이용해 표현식의 값을 보유한다:

| parent |
parent := self listPane parent.
parent color: Color black.
parent height: 17.
parent width: 11.


스몰토크의 몇 안 되는 구문적 특징 중 하나는 이 문제에 대한 해결책이다. 스몰토크는 표현식을 보유하도록 임시 변수를 생성하거나 표현식을 반복해야 하는 대신 하나의 메시지 끝에 "여기 동일한 메시지로 가는 또 다른 메시지가 있다,"고 말할 수 있도록 해준다.


  • 동일한 수신자로 여러 개의 메시지를 전송하기 위해서는 Cascade를 사용하라. 메시지들은 세미콜론으로 구분하라. 각 메시지는 고유의 행에 놓고 한 행만큼 들여 써라. zero 또는 one argument로 된 메시지에는 Cascades만 사용하라.


위의 코드는 아래와 같아진다:

self listPane parent
    color: Color black;
    height: 17;
    width: 11

Cascade의 사용 여부는 사실상 의도의 문제이다. "여기 동일한 메시지로 향하는 메시지 무리가 있다,"고 전달하고 싶다면 Cascade를 사용하기 좋은 시점이다. 어쩌다가 보니 동일한 객체로 메시지를 전송하게 되었지만 두 메시지가 동일한 객체로 전송되는 것이 코드의 본질이 아니라면 Cascade를 사용하지 말라.


Cascade와 관련해 자주 발생하는 한 가지 혼동은, 초기 표현식이 복잡할 경우 cascaded 메시지들은 어디로 전송되느냐와 관련된다.


예를 들어:

OrderedCollection new
    add: 5;
    add: 10


위에서 들여쓰기는 두 가지 덧셈(add) 모두 클래스 자체가 아니라 새로운 OrderedCollection으로 전송됨을 암시한다. 여기서 규칙은 다음과 같다: Cascade에서 모든 연속된 메시지들은 cascade에서 첫 번째 메시지와 동일한 수신자로 (이번 경우 #add:) 향한다. 당신을 수신자에게 데려오게 된 이전의 표현식 부분은 모두 무관하다.


Cascades는 오직 zero 또는 one argument 메시지와 함께 사용해야 하는 제약은 다양한 argument수로 된 Cascades를 시각적으로 파싱하는 데에 발생하는 어려움에서 비롯된다. 위의 예제에서 만일 height:width:를 단일 메시지로서 전송하면 어떻게 될까? Cascade를 이용하면 코드는 아래와 같아진다:

self listPane parent
    color: Color black;
    height: 17
    width: 11


언뜻 보면 높이와 너비가 따로 설정되었는지 아니면 함께 설정되었는지 알 수 없다. 전송된 메시지가 무엇인지 알아내느라 시간을 소요해야 한다면 Cascade을 이용해 증가한 가독성은 금새 무용지물이 된다. 다행히 대부분의 경우 메시지는 동일한 수신자로 향하며 (특히 2개 이상) 메시지는 간단하다.


Cascade의 값을 사용 중이라면 Yourself(p.186)를 사용해야 하는 수도 있다.


Notes