GRASP 패턴 - PROTECTED VARIATIONS
GRASP 패턴의 PROTECTED VARIATIONS, 변경으로 부터 객체를 보호하는 방법에 대해 알아보자
PROTECTED VARIATIONS 패턴
이 패턴은 책임 할당의 관점
에서 캡슐화
를 설명하는 것으로 객체를 변경으로 부터 분리하고, 추상화타입을 통해 캡슐화 하면 결합도와 응집도 모두를 만족 시킬 수 있다.
변경이 예상되는 지점은 클라이언트가 구체적인 타입을 알 수 없도록 추상화 타입을 사용
의존성의 방향을 인터페이스로 향하도록 변경해라
추상화 타입과 코드의 복잡성
앞서 PROTECTED VARIATIONS 패턴, POLYMORIPHISM 패턴의 공통된 내용은 추상화 타입을 사용한다라는 것이다.
추상화 타입을 사용하므로서 변경에 더 유연하게 대응할 수 있지만 코드의 복잡성이 올라간다라는 단점도 갖고 있다.
우리가 GRASP 패턴을 배우는 이유에 대해서 다시 한번 생각해보면 변경에 쉽게 대응할 수 있는 설계를 하고 싶기 때문이다.
그러면 변경에 쉽게 대응할 수 있는 설계는 첫번째로 어떠한 개발자가 와도 읽기 쉬운 단순한 설계
를 갖게 하는것이고, 두번째로는 최소한의 수정으로 변경에 대응할 수 있는 유연한 설계
를 하는것이다.
가장 좋은건 단순한 설계를 통해 이해하기 쉬운 설계를 하는 것이고, 유사한 변경이 반복적으로 발생할 경우 복잡성이 상승하더라도 추상화타입
을 통해 유연한 설계를 하는것이 좋다.
여기서 말하는 유사한 변경이 반복적으로 발생한다라는 것은 비슷한 책임을 수행하면서 조건 연산자를 통해 분기되는 코드가 있을 경우를 말한다.
무조건적으로 추상화 타입을 통해 유연한 설계를 하겠다라는 생각은 이해하기 어려운 코드를 작성하게 되어 오히려 변경에 대응하기 더 어려운 코드가 되버리는 경우가 많으니 주의해야한다.
책임 주도 설계
GRASP 패턴은 객체의 책임을 분배하는데 도움이 되는 패턴이다. 이러한 패턴을 익혀 책임을 할당하는데 판단하는 시간을 줄이는 것이 중요하다고 생각한다.
하지만 처음부터 책임주도 설계를 적용하기란 쉽지 않기 때문에 일단 동작하는 코드를 빠르게 만든 뒤 리펙토링
과정을 통해 지금까지 배웠던 GRASP 패턴을 하나씩 적용해 나가는게 좋다.
동작하는 코드를 먼저 구현한 다음 캡슐화, 결합도, 응집도를 이해한 상태에서 객체지향 원칙을 적용해 나가는 리펙토링 과정을 거치는 것도 깔끔한 코드를 얻을 수 있는 방법이다.
결과적으로 내부 구현은 캡슐화, 모든 클래스는 변경의 이유가 1개씩만 갖는 상태, 각 객체는 높은 응집도와 낮은 결합도를 갖음, 클래스는 작고 1가지 일만 수행, 책임은 적절하게 분배 되어야함