일관성 있는 협력에 대한 내용이다
자세한 내용이 궁금하면 오브젝트를 펼쳐보는 걸 추천드립니다.📖
시작하면서
객체지향 설계의 목표는 적절한 책임을 수행하는 객체들의 협력을 기반으로 결합도가 낮고 재사용 가능한 코드 구조를 창조하는 것이다. 개발하다 보면 유사한 요구사항을 반복적으로 추가하거나 수정할 수 있다. 유사한 요구사항을 추가하는 상황에서 협력마다 서로 다른 패턴으로 변경되면 전체적인 설계의 일관성이 무너지게 된다.
객체지향 패러다임의 장점은 설계를 재사용할 수 있다는 것이다. 재사용을 위해서는 객체들의 협력 방식을 일관성 있게 만들어야 한다.
일관성 있는 협력패턴을 적용하면 코드가 이해하기 쉽고 직관적이며 유연 해지는 것을 알 수 있다.
* 개념과 구현 모두 일관성이 있어야 한다.
비일관성의 문제
유사한 요구사항을 일관성 없이 대응하면 두 가지 상황에서 발목을 잡힌다.
- 기존의 구현을 이해해야 하는 상황 : 개념적으로 연결되었어도 구현에 일관성이 없이 서로 다른 방식으로 구현되어있으면 독립적인 존재로 의심하게 될 것이다. 요구사항만큼 독립적으로 이해해야 하는 어려움이 생긴다.
- 새로운 구현을 추가해야 하는 상황 : 기존 요구사항을 이해해야 비슷한 유형의 요구사항을 추가할 수 있다. 하지만 일관성 없는 기존의 요구사항 때문에 새로운 구현을 해도 일관성이 없을 것이다.
설계에 일관성 부여
일관성 있는 설계를 만드는 데 가장 훌륭한 조언은 다양한 설계 경험을 익히라는 것이다.
두 번째 조언은 디자인 패턴을 학습하고 변경이라는 문맥안에서 디자인 패턴을 적용해 보는 것이다.
협력을 일관성 있게 만들기 위한 지침이 있다.
- 변하는 개념을 변하지 않는 개념으로부터 분리하라.
- 변하는 개념을 캡슐화하라.
바뀌는 부분을 따로 뽑아 캡슐화한다. 그렇게 하면 나중에 바뀌지 않는 부분에는 영향을 미치지 않은 채로 그 부분만 고치거나 확장할 수 있다.
패턴은 매우 빈번하게 요소들이 관계를 맺을 수 있는 대상을 추상적인 기반 타입으로 제한한다.
캡슐화 다시 살펴보기
캡슐화를 이야기하면 대부분 데이터 은닉을 생각할 수 있다. 그러나 캡슐화는 데이터 은닉 이상이다.
설계에서 무엇이 변화될 수 있는 지 고려하라. 이 접근법은 재설계의 원인에 초점을 맞추는 것과 반대되는 것이다. 설계에 변경을 강요하는 것이 무엇인지에 대해 고려하기보다는 재설계 없이 변경할 수 있는 것이 무엇인지 고려하라. 여기서의 초점은 많은 디자인 패턴의 주제인 변화하는 개념을 캡슐화하는 것이다.
즉, 캡슐화란 단순히 데이터를 감추는게 아니라 변할 수 있는 모든 '개념'을 감추는 것이다.
캡슐화의 가장 대표적인 예는 객체의 퍼블릭 인터페이스와 구현을 분리하는 것이다.
캡슐화의 종류
- 데이터 캡슐화 : 인스턴스의 변수를 private로 해야 외부에서 접근을 하지 못한다. 접근할 유일한 방법은 메서드를 이용하는 거다. 한마디로 클래스는 내부에서 관리하는 데이터를 캡슐화한다.
- 메서드 캡슐화 : 메서드 가시성이 protected이면 외부에서는 접근을 못한다. 오로지 클래스 내부와 서브클래스에서만 접근이 가능하다. 한마디로 외부에 영향을 미치지 않는 클래스의 내부 활동을 캡슐화한다.
- 객체 캡슐화 : 객체를 인스턴스 변수로 사용하는 합성을 의미하는 캡슐화다.
- 서브타입 캡슐화 : 다형성의 기반이 되는 캡슐화다.
일관성 있게 만들기
1. 변경 분리하기
일관성 있는 협력을 만들기 위해서는 변하는 개념과 변하지 않는 개념을 분리하는 것이다.
변하지 않는 것은 '규칙'이고 변하는 것은 '적용조건'이다.
2. 변경 캡슐화하기
변경을 캡슐화해서 파급효과를 줄여야 한다.
3. 협력 패턴 설계하기
변하는 부분을 적절히 추상화하고 나면 변하는 부분을 생략한 채 변하지 않는 부분만을 이용해 객체 사이의 협력을 이야기한다.
4. 추상화 수준에서 협력 패턴 구하기
변하는 것과 변하지 않는 것을 분리하고 변하는 것을 캡슐화한 코드는 오로지 변하지 않는 것과 추상화에 대한 의존성만으로 전체적인 협력을 구현할 수 있다.
5. 구체적인 협력 구현하기
유사한 기능에 대해 유사한 협력 패턴을 적용하는 것은 객체지향 시스템에서 개념적 무결성(Conceptual Integrity)을 유지할 수 있는 효과적인 방법이다. 시스템이 일관성 있는 패턴으로 구성되어있다면 시스템을 이해하고, 수정하고, 확장하는 데 노력과 시간을 아낄 수 있다.
협력 패턴에 맞추기
때때론 협력 패턴에 부조화가 느껴지는 경우가 있는데 설계를 약간 비트는 것이 조금 이상한 구조를 낳더라도 전체적으로 일관성을 유지할 수 있는 설계를 선택하는 것이 현명하다. 개념적 무결성을 무너뜨리는 것보다 약간의 부조화를 수용하자.
지속적으로 개선하라
일관성 있는 협력 패턴을 유지해도 시간이 지날수록 새로운 요구사항이 추가되는 과정에서 일관성이 조금씩 흔들릴 수 있다. 초기에 모든 요구사항을 예상할 수 없기에 잘못된 것도 아니고 자연스러운 현상이다.
협력은 고정된 것이 아니다. 변경에 따라 협력 패턴을 유지하기 어려우면 유지할 수 있는 협력 패턴으로 과감하게 리팩터링하라.
중요한 것은 변경의 방향에 맞춰 지속적으로 코드를 개선하려는 의지 다.
패턴을 찾아라
일관성 있는 협력의 핵심은 변경을 분리하고 캡슐화하는 것이다.
훌륭한 설계자가 되는 첫걸음은 변경의 영향을 파악하는 날카로운 감각을 기르는 것이다.
협력을 일관성 있게 만드는 것은 유사한 변경을 수용할 수 있는 협력 패턴을 발견하는 것과 동일하다.
'서적 > 오브젝트: 코드로 이해하는 객체지향 설계' 카테고리의 다른 글
오브젝트 포스팅을 끝내며 (0) | 2021.06.10 |
---|---|
오브젝트 15_ 디자인 패턴과 프레임워크 (0) | 2021.06.10 |
오브젝트 13_ 서브클래싱과 서브타이핑 (0) | 2021.06.10 |
오브젝트 12_ 다형성 (0) | 2021.06.10 |
오브젝트 11_ 합성과 유연한 설계 (0) | 2021.06.10 |