14장 정리
객체는 협력을 위해 존재하며, 객체지향 설계의 목표는 적절한 책임을 수행하는 객체들의 협력을 기반으로
결합도가 낮고 재사용 가능한 코드 구조를 창조하는 것이다.
객체지향 패러다임의 장점은 설계를 재사용할 수 있다는 것이다.
하지만 재사용을 공짜로 얻어지지 않으며, 객체들의 협력 방식을 일관성 있게 만들어야 한다.
일관성 있는 협력 패턴을 적용하면 코드 전체를 이해하기 쉽고 직관적이며 유연해진다.
설계에 일관성 부여하기
유사한 기능을 서로 다른 방식으로 구현해서는 안된다.
객체지향에서 기능을 구현하는 유일한 방법은 객체 사이의 협력을 만드는 것이다.
따라서 유지보수 가능한 시스템을 구축하는 첫걸음은 협력을 일관성 있게 만드는 것이다.
협력을 일관성 있게 만들기 위해 다음과 같은 기본 지침을 따르는 것이 도움이 된다.
변하는 개념을 변하지 않는 개념으로부터 분리하라.
변하는 개념들을 개별적인 객체로 분리하고, 이 객체들과 일관성 있게 협력하기 위해 타입 계층을 구성한다.
타입 계층을 클라이언트로 분리하기 위해 역할을 도입하고, 최종적으로 역할을 추상 클래스와 인터페이스로 구현한다.
이렇게 하면 결과적으로 변하는 개념을 별도의 서브타입으로 분리한 후 이 서브타입들을 클라이언트로부터 캡슐화할 수 있다.
변하는 개념을 캡슐화하라.
핵심은 훌륭한 추상화를 찾아 추상화에 의존하도록 만드는 것이다.
타입을 캡슐화하고 낮은 의존성을 유지하기 위해서는 이전 장들에서 살펴본 설계 원칙들을 적용하면 도움이 된다.
- 6장의 인터페이스 설계 원칙들을 적용하면 구현을 효과적으로 캡슐화하는 코드를 구현할 수 있다.
- 8, 9장의 의존성 관리 기법을 적용하면 타입을 캡슐화하기 위해 낮은 결합도를 유지할 수 있는 방법을 보여준다.
- 10장을 통해 타입을 캡슐화 하는게 아닌, 코드 재사용을 위해 상속을 사용하는 것의 단점을 보여준다.
- 11장에서 배운 상속 대신 합성을 사용하면 훌륭한 캡슐화를 구현할 수 있다.
- 13장에서 설명한 원칙을 따르면 리스코프 치환 원칙을 준수하는 타입 계층을 구현하는 데 상속을 이용할 수 있다.
변경에 초점을 맞추고 캡슐화의 관점에서 설계를 바라보면 일관성 있는 협력 패턴을 얻을 수 있다.
캡슐화 다시 살펴보기
많은 사람들은 객체의 캡슐화를 들으면 데이터 은닉을 떠올리지만, 캡슐화는 데이터 은닉 그 이상의 개념이다.
단순히 데이터를 감추는것이 아닌, 소프트웨어 안에서 변할 수 있는 모든 '개념'을 감추는 것이다.
변경을 캡슐화 할 수 있는 다양한 방법이 존재하지만 협력을 일관성 있게 만들기 위해 가장 일반적으로 사용하는 방법은 서브타입 캡슐화와 객체 캡슐화를 조합하는 것이다.
서브타입 캡슐화는 인터페이스 상속을 사용하고, 객체 캡슐화는 합성을 사용한다.
서브타입 캡슐화와 객체 캡슐화를 적용하는 방법은 다음과 같다.
변하는 부분을 분리해서 타입 계층을 만든다.
변하지 않는 부분으로부터 변하는 부분을 분리한다.
변하는 부분들의 공통적인 행동을 추상화하여 추상 클래스나 인터페이스로 추상화한 후 이를 타입 계층화한다.
변하지 않는 부분의 일부로 타입 계층을 합성한다.
앞에서 구현한 변하는 부분을 변하지 않는 부분에 합성한다.
의존성 주입과 같이 결합도를 느슨하게 유지할 수 있는 방법을 이용해 오직 추상화에만 의존하게 만든다.
지속적으로 개선하라
처음에는 일관성을 유지하는 것처럼 보이던 협력 패턴이 시간이 흐르면서 새로운 요구사항이 추가되는 과정에서 일관성의 벽에 조금씩 금이 가는 경우를 자주 보게 된다.
협력을 설계하는 초기 단계에서 모든 요구사항을 미리 예상할 수 없기 때문에 이는 자연스러운 현상이다.
협력은 고정된것이 아니므로 현재의 협력 패턴이 변경의 무게를 지탱하기 어렵다면 변경을 수용할 수 있는 협력 패턴으로 과감하게 리팩터링하라.
요구사항의 변경에 따라 협력 역시 지속적으로 개선해야 한다.
현재의 설계에 맹목적으로 일관성을 맞추는 것이 아니라 달라지는 변경의 방향에 맞춰 지속적으로 코드를 개선해야 한다.
인상깊었던 점
"유지보수 가능한 시스템을 구축하는 첫걸음은 협력을 일관성 있게 만드는 것이다."
이번 장에서는 일관성 있는 협력의 중요함을 말하고 있는것 같다.
이전 장들에서 공부했던 인터페이스 분리원칙, 서브타입/슈퍼타입 관계와 리스코프 치환 원칙 등을 따라서
변하는 부분과 변하지 않는 부분을 분리하는 방법을 설명해준 부분을 통해 이전 장의 내용과 연관지어 생각할 수 있었다.
또한 시간이 지나면서 협력의 일관성이 깨질 수 있지 않을까? 라고 생각했는데
마지막 장에서 이에 대한 가능성을 언급하며 현재의 설계에 맹목적으로 협력의 형태를 맞추는게 아닌,
지속적으로 코드를 개선해야 함을 언급한 점도 좋았다.
'공부방 > 북스터디' 카테고리의 다른 글
[오브젝트] 13장 (0) | 2024.04.08 |
---|---|
[오브젝트] 12장 (0) | 2024.03.26 |
[오브젝트] 11장 (0) | 2024.03.18 |
[오브젝트] 10장 (0) | 2024.03.04 |
[오브젝트] 9장 (0) | 2024.02.20 |