제어 흐름 : 연산을 여러 단계로 나타낸다.
주요 흐름 : 주요 제어 흐름을 명확하게 표현한다.
- 프로그램의 주요 흐름을 명확히 표현하라. 흔치 않은 상황이나 에러 상황은 예외와 조건절을 사용해서 표현하면 된다.
메시지 : 메시지를 보내서 제어 흐름을 표현한다.
선택 메시지 : 여러 선택 사항을 나타내기 위해 메시지 구현자를 다양화 한다.
public void displayShape(Shape subject, Brush brush) {
brush.display(subject);
}
예를 들어 여러 방법 중 한 가지로 그래픽을 표시해야 할 때, 런타임에 선택이 일어남을 나타내기 위해 다형적 메시지를 사용한다.
display() 메시지는 런타임에 브러시의 타입에 따라 구현을 선택한다.
ScreenBrush, PostscriptBrush 등등
더블 디스패치 : 두 가지 축으로 메시지 구현자를 다양화해서 중첩된 선택을 표현한다.
예를 들어 포스트스크립트로 출력할 타원과 스크린에 출력할 직사각형의 연산과정의 차이점을 표현하고 싶다고 하자.
displayShape(Shape subject, Brush brush) {
subject.displayWith(brush);
}
// 각 shape은 다른 방식으로 displayWith()를 구현할 수 있다.
//하지만 세부 구현을 대신하는 자신의 타입을 Brush로 넘겨주자
Oval.displayWith(Brush brush) {
brush.displayOval(this);
}
Rectangle.displayWith(Brush brush) {
brush.displayRectangle(this);
}
PostscriptBrush.displayRectangle(Rectangle subject) {
writer print(subject.left() + " " + ... + rect);
}
더블 디스패치를 사용하면 유연성은 조금 잃게 되며, 코드 중복이 발생한다.
분리(순차) 메시지 : 복잡한 연산은 밀접한 단위의 연산으로 나눈다.
되돌림 메시지 : 메시지를 같은 수신자에게 보내서 제어 흐름에 대칭성을 부여한다.
초청 메시지 : 다른 방식으로 구현될 수 있는 메시지를 보내서 미래에 일어날 변형을 대비한다.
설명 메시지 : 로직을 설명하기 위해 메시지를 보 낸다.
예외 흐름 : 주요 흐름에 대한 표현을 방해하지 않으면서, 가급적 명확하게 예외적 제어 흐름을 표현한다.
보호 구문 : 지역적 예외ㅎ 흐름은 이른 반환을 통해 표현한다.
예외 : 비 지역적 예외 흐름은 예외로 표현한다.
체크 예외 : 예외를 전달할 때에는 예외 처리자에게 적합한 정보를 전달할 수 있도록 필요에 따라 예외의 형태를 변화한다.