본문 바로가기

카테고리 없음

[켄트 벡의 구현 패턴] 7장 행위

제어 흐름 : 연산을 여러 단계로 나타낸다. 

주요 흐름 : 주요 제어 흐름을 명확하게 표현한다. 

- 프로그램의 주요 흐름을 명확히 표현하라. 흔치 않은 상황이나 에러 상황은 예외와 조건절을 사용해서 표현하면 된다. 

메시지 : 메시지를 보내서 제어 흐름을 표현한다. 

선택 메시지 : 여러 선택 사항을 나타내기 위해 메시지 구현자를 다양화 한다. 

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);
}

더블 디스패치를 사용하면 유연성은 조금 잃게 되며, 코드 중복이 발생한다. 

분리(순차) 메시지 : 복잡한 연산은 밀접한 단위의 연산으로 나눈다.

 

되돌림 메시지 : 메시지를 같은 수신자에게 보내서 제어 흐름에 대칭성을 부여한다. 

초청 메시지 : 다른 방식으로 구현될 수 있는 메시지를 보내서 미래에 일어날 변형을 대비한다. 

설명 메시지 : 로직을 설명하기 위해 메시지를 보 낸다. 

예외 흐름 : 주요 흐름에 대한 표현을 방해하지 않으면서, 가급적 명확하게 예외적 제어 흐름을 표현한다. 

보호 구문 : 지역적 예외ㅎ 흐름은 이른 반환을 통해 표현한다. 

예외 : 비 지역적 예외 흐름은 예외로 표현한다. 

체크 예외 : 예외를 전달할 때에는 예외 처리자에게 적합한 정보를 전달할 수 있도록 필요에 따라 예외의 형태를 변화한다.