- 객체는 협력을 위해 존재
- 객체지향 설계의 목표는 협력을 기반으로 결합도가 낮고 재사용 가능한 코드 구조를 창조하는 것
- 일관서 있는 협력 패턴을 적용하면 코드가 이해하기 쉽고 직관적이며 유연해진다
01 핸드폰 과금 시스템 변경하기
기본 정책 확장
고정요금 방식 구현하기
시간대별 방식 구현하기
요일별 방식 구현하기
구간별 방식 구현하기
- 비일관성의 문제점
- 새로운 구현을 추가하면 추가할 수록 비일관성이 심해진다.
- 코드를 이해하기 어렵다.
- 유사한 기능을 서로 다른 방식으로 구현해서는 안된다는 것이다.
02 설계에 일관성 부여하기
- 협력을 일관성 있게 만들기 위해서는...
- 변하는 개념을 변하지 안흔 개념으로 분리
- 변하는 개념을 캡슐화
조건 로직 대 객체 탐색
- 클래스 분리 기준
- 일관성 있는 협력을 위한 지침
- 변하는 개념을 변하지 않는 개념으로부터 분리
- 변하는 개념을 캡슐화
캡슐화 다시 살펴보기
- 캡슐화란 변할 수 있는 모든 '개념'을 감추는 것
- 데이터 캡슐화
- 메서드 캡슐화
- 객체 캡슐화
- 서브타입 캡슐화
- 변하는 부분을 분리해서 타입 계층을 만든다.
- 변하지 않는 부분으로 부터 변하는 부분을 분리
- 변하는 부분들의 공통적인 행동을 추상 클래스나 인터페이스로 추상화
- 변하는 부분들이 해당 추상 클래스나 인터페이스를 상속받게 만든다.
- 변하지 않는 부분의 일부로 타입 계층을 합성한다.
- 타입 계층을 변하지 않는 부분에 합성한다.
- 변하지 않는 부분이 변경되는 구체적인 사항에 결합되지 않도록 만든다.
03 일관성 있는 기본 정책 구현하기
변경 분리하기
- 일관성 있는 협력을 만드릭 위한 첫 번쨰 단계는 변하는 개념과 변하지 않는 개념을 분리하는 것
변경 캡슐화하기
- 변경을 캡슐화하는 가장 좋은 방법은 변하지 않는 부분으로 변하는 부분을 분리하는 것
협력 패턴 설계하기
추상화 수준에서 협력 패턴 구현하기
- 변하는 것과 변하지 안흔 것을 분리하고 변하는 것을 캡슐화한 코드는 오로지 변하지 않는 것과 추상황에 대한 의존성만으로도 전체적인 협력을 구현할 수 있다.
구체적인 협력 구현하기
시간대별 정책
요일별 정책
구간별 정책
- 유사한 기능에 대해 유사한 협력 패턴을 적용하는 것은 객체지향 시스템에서 개념적 무결성(일관성)을 유지할 수 있는 가장 효과적인 방법이다.
협력 패턴에 맞추기
- 가급적 기존의 협력 패턴에 맞추는 것이 가장 좋은 방법이다.
- 개념적 무결서을 무너뜨리는 것보다는 약간의 부조하를 수용하는 편이 더 낫다.
패턴을 찾아라