객체는 협력을 위해 존재한다. 협력은 객체가 존재하는 이유와 문맥을 제공한다. 객체지향 설계의 목표는 적절한 책임을 수행하는 객체들의 협력을 기반으로 결합도가 낮고 재사용 가능한 코드 구조를 창조하는 것이다.
유사한 요구사항을 계속 추가해야 하는 상황에서 각 협력이 서로 다른 패턴을 따를 경우에는 전체적인 설계의 일관성이 서서히 무너지게 된다.
객체지향 패러다임의 장점은 설계를 재사용할 수 있다는 것이다.
재사용을 위해서는 객체들의 협력 방식을 일관성 있게 만들어야 한다.
일관성은 설계에 드는 비용을 감소시킨다. 과거의 해결 방법을 반복적으로 사용해서 유사한 기능을 구현하는데 드는 시간과 노력의 절약이 가능하기 때문이다.
또한 일관성있는 설계는 코드를 이해하기 쉽게 만든다.
특정 문제를 유사한 방법으로 해결하고 있다는 사실을 알면 문제를 이해하는 것 만으로도 코드의 구조를 예상할 수 있게 된다.
비일관성은 다음의 두 가지 상황에서 발목을 잡는다.
대부분의 사람들은 유사한 요구사항을 구현하는 코드는 유사한 방식으로 구현될 것이라고 예상한다.
하지만 유사한 요구사항이 서로 다른 방식으로 구현되어 있다면 유사하다는 사실 자체도 의심하게 될 것이다.
풍부한 경험을 가진 사람은 어떤 변경이 중요한지, 그 변경을 어떻게 다뤄야 하는지에 대한 통찰력을 갖게 된다.
어떤 위치에서 일관성을 보장해야 하고 일관성을 제공하기 위해 어떤 방법을 사용해야 하는지를 직관적으로 결정할 수 있다.
디자인 패턴은 특정한 변경에 대해 일관성 있는 설계를 만들 수 있는 경험 법칙을 모아놓은 일종의 설계 템플릿이다.
디자인 패턴을 학습하면 빠른 시간안에 전문가의 경험을 흡수할 수 있다.
캡슐화에는 다양한 종류가 존재한다.
서브타입 캡슐화와 객체 캡슐화를 적용하는 방법은 다음과 같다.
처음에는 일관성을 유지하는 것처럼 보이던 협력 패턴이 시간이 흐르면서 새로운 요구사항이 추가되는 과정에서 일관성의 벽이 조금씩 금이 가는 경우를 자주 보게된다.
협력을 설계하는 초기 단계에서 모든 요구사항을 미리 예상할 수 없기 때문에 이것은 잘못이 아니며 꽤나 자연스러운 현상이다.
협력은 고정된 것이 아니다. 만약 현재의 협력 패턴이 변경의 무게를 지탱하기 어렵다면 변경을 수용할 수 있는 협력패턴을 향해 과감하게 리팩터링 하라.
중요한 것은 현재의 설계에 맹목적으로 일관성을 맞추는 것이 아니라 달라지는 변경의 방향에 맞춰 지속적으로 코드를 개선하려는 의지다.
객체지향 설계는 객체의 행동과 그것을 지원하기 위한 구조를 계속 수정해나가는 작업을 반복하며 다듬어진다. 협력자들 간에 부하를 좀 더 균형있게 배분하는 방법을 새로 만들어내면 나눠줄 책임이 바뀌게 된다. 만약 객체들이 서로 통신하는 방법을 개선해냈다면 이들간의 상호작용은 재정의되어야 한다. 이 같은 과정을 거치며 객체들이 자주 통신하는 경로는 더욱 효율적이게 되고 주어진 작업을 수행하는 표준 방안이 정착된다.