본문 바로가기

Homo Design

설계 패턴 (Design Pattern) 사용법


설계 패턴을 사용하는 방법은 GoF 책의 첫부분에 단계별로 다음과 같이 적혀있다.

1. 개괄적으로 한번 패턴을 훑은다 : 패턴이 해당 문제에 적합한지를 따져보기 위해 적용(Applicability)와 결론(Consequences) 부분을 특별한 주의를 갖는다.

2. 다시 되돌아가서 구조(structure), 구성요소(participant), 구성요소간 관계(collaborations)에 대해 숙지한다 : 패턴에 있는 클래스들과 객체들에 대해 이해하고 서로 어떤 관계가 있는지를 확인한다.

3. 코드에서 패턴의 구체적인 예를 살펴보기 위해 예제 코드(Sample Code) 부분을 본다 : 코드에 대한 공부는 패턴이 어떻게 구현되지는지를 배우는데 도움이 된다.

4. 어플리케이션 범주에서 의미있는 패턴 구성요소에 대한 이름을 선정한다 : 설계 패턴에 있는 구성요소들의 이름은 어플리케이션에 직접적으로 표현하기에 너무 추상적이다. 그럼에도 불구하고, 어플리케이션에 나타나는 이름으로 구성요소의 이름을 적당히 사용하는 것은 쓸모있다. 이는 구현에서 패턴을 좀 더 명시적으로 만드는데 도움이 된다. 예를 들어, 텍스트 결합 알고리즘에서 Strategy 패턴을 사용하는 경우, 클래스를 SimpleLayoutStrategy 혹은 TextLayoutStrategy라고 만들 수 있다.

5. 클래스를 정의한다 : 클래스에 대한 인터페이스를 정의하고, 상속(혹은 구현)  관계를 맺고, 데이터와 객체 참조를 나타내는 인스턴스 변수를 정의한다. 패턴이 영향을 미치고, 이에 따라 해당 클래스를 변경하는 어플리케이션 내의 기존 클래스들을 식별한다.

6. 패턴에 있는 오퍼레이션에 대해 어플리케이션에 특화된 이름을 정의한다 : 오퍼레이션 이름 역시 보통 어플리케이션에 따라 달라진다. 각 오퍼레이션과 관련된 책임성(responsiblity)과 협업관계(collaboration)을 참조하여 사용한다. 또한, 네이밍 규칙(naming convention)에 따라 일관성을 유지한다. 예를 들어, Factory method임을 표시하도록 일관되게 "create-" 라는 접두어를 사용할 수도 있다.

7. 패턴에 있는 책임성과 협업관계를 수행하는 오퍼레이션을 구현한다 : 구현(implementation) 부분은 구현에 대한 가이드로 힌트를 제공한다. 예제 코드에 있는 사례 역시 도움이 될 수 있다.

위의 절차는 단순히 가이드일 뿐이다. 패턴을 공부하면서 자신에 맞는 설계 패턴을 사용하는 방법을 개발할 수 있다.

설계 패턴을 사용하는 방법에 대한 논의는 패턴을 사용하지 않는 방법을 통해 완성될 수도 있다. 설계 패턴은 무차별적으로 적용되어서는 안된다. 간접적인 형태로 추가된 또 다른 영역으로 유연성(flexibility)과 변이성(variability)을 완성하려 하고, 이는 종종 복잡한 설계의 형태로 나타나거나 수행(performance)에 있어서 또 다른 형태로 비용이 발생될 수도 있다. 설계 패턴은 유연성이 실질적으로 필요할 때에만 적용되어야 한다. 결론(Consequence) 부분은 패턴의 장정과 책임(liability)를 평가하는데 가장 도움이 된다.
반응형