GRASP 패턴 - LOW COUPLING & HIGH COHESION
이전글에서 GRASP 패턴의 Infomation expert 까지 살펴보았고 이제 그 다음 패턴으로 Low coupling & High cohesion에 대해서 알아보자
Low coupling & High cohesion (낮은 결합도 & 높은 응집도)
책임을 할당할 수 있는 대안이 다양하게 있을 경우 최대한 낮은 결합도
와 높은 응집도
방향을 유지할 있는 대안으로 선택한다.
Low coupling & High cohesion는 객체에 책임을 할당할 때 항상 고려해야 하는 기본 원리다.
여기서 낮은 결합도, 높은 응집도 라는 말은 학부시절 시험에 빈칸 넣기 단골 문제였던지라 막연하게 외우기만 했지 왜 필요한지 정확하게 이해하고 넘어갈 필요가 있다.
먼저 낮은 결합도
부터 살펴보자
Low coupling
우리가 어플리케이션의 설계를 하는 이유는 무엇일까? 가장 큰 이유는 코드의 변경이 있을 경우 sideEffect가 없도록 하기 위함이다. 덤으로 객체의 재사용성도 증가할 것이다.
Low coupling의 의미는 객체간의 낮은 의존성이다.
sideEffect를 줄이기 위해서는 객체간의 의존성을 줄이는 방법이 가장 기본이다. 왜냐하면 의존성을 갖는 객체를 수정할 경우 수정된 객체에 의존성을 갖는 객체들까지 모두 수정이 필요하거나 테스트가 필요하기 때문이다. 결국 하나의 변경이 다른 객체의 변경을 초래하는 결과를 갖도록 하면 안된다라는 것이다. 또한 객체간의 의존성이 낮을수록 객체의 재사용성이 증가한다. 여기서 말하는 재사용성이란 객체를 다른곳에서 얼마나 쉽게 재사용할 수 있느냐라는 뜻이다. 만약 A라는 객체를 사용하기 위해 B,C의 객체를 의존성으로 꼭 가져가야한다면 굉장히 불편할 것이다.
그렇다면 low coupling을 유지하기위한 방법은 무엇일까? GRASP 패턴을 소개하면서 도메인 개념
에서 부터 출발 이라고 언급을 하였다. 도메인 개념에서 최대한 결합도의 가지수가 적은 방향으로 설계를 하면된다. 설계는 트레이드 오프의 활동이므로 결합이 없을 순 없다. 그저 더 나은 방향으로 나아가야할 뿐이다.
High cohesion
의존성의 관계가 복잡해지면 코드를 읽기 어렵고, 유지보수도 힘들어진다.
이때 복잡성을 해결하기 위한 높은 결합도을 지키는 코드를 작성하면된다.
여기서 말하는 높은 결합도를 갖는 코드는 어떻게 작성하면 될까? 정답은 같은 책임
을 갖는 객체들끼리 묶여 있으면 된다.
즉 도메인 개념
에서 부터 객체에 책임을 할당하는 과정을 잘 해야 높은 응집도를 갖는 코드를 작성할 수 있다.
높은 응집도를 유지할 수 있게 책임을 할당해라
응집도가 높다면 같은 책임을 수행하는 객체끼리 모여있으므로 코드의 복잡도가 낮아진다. 코드의 가독성을 따질 때 의외로 맥략이 정말 중요한데 예를 들어 빅맥을 주문하는 책임을 갖는 객체의 코드를 읽고 있는데 빅맥을 취소하는 객체가 있을 경우 코드를 읽는 사람의 입장에서는 주문하는 코드를 읽으러 들어왔는데 갑자기 다른 이야기를 하는 코드가 있어 읽기가 더 어려워진다. ( 서로 다른 책임이 많아 질수록 if 분기가 늘어갈 수 밖에 없으므로 코드 읽기는 1000% 더 복잡해진다. ) 즉 같은 책임을 수행하다보니 자연스레 분기가 많이 사라질 것이다.
또한 빅맥 취소 객체가 수정될 경우 빅맥 주문의 객체도 영향이 갈 것이니 sideEffect가 발생한다. 그러니 같은 책임을 갖는 객체끼지 모아두는게 sideEffect를 줄일수 있는 지름길이다.
Low coupling & High cohesion을 잘 지키면 sideEffect의 위험성이 낮아지고, 객체의 재사용성이 증가한다.
다음으로는 creator 패턴에 대해서 알아보자