오브젝트: 코드로 이해하는 객체지향 설계 14장을 읽으며
느낀점
서비스 발전하면서 계속 코드 수정하게 되는데, 그때는 맞고 지금은 틀리다가 가장 정확한 표현인 것 같다
일관성 있는 협력
객체는 협력을 위해 존재하며, 협력은 객체가 존재하는 이유와 문맥을 제고
- 잘 설계된 애플리케이션은 이해하기 쉽고, 수정이 용이하며, 재사용 가능합 협력의 모임
- 일관성 있는 패턴을 적용하면 이해하기 쉽고 직관적이며 유연해진다는 것
코드 재사용을 위한 상속은 해롭다
두 클래스 사이의 강한 결합도는 설계 개선과 기능의 추가를 방해
설계에 일관성 부여하기
일관성 있는 설계를 만드는데 가장 훌룡한 조언은 다양한 설계 경험을 익히는 것
- 풍부한 설계를 가진 사람은, 그 변경을 어떻게 다뤄야 하는지에 대한 통찰력을 가짐
- 일관성을 제공하기 위해 어떤 방법을 사용해야 하는지를 직관적으로 결정할 수 있음
- 설계 경험을 단기간에 쌓아 올리는 것은 생각보다 어려움
두번째 조언은 디자인 패턴을 학습하고 변경이라는 문맥 안에서 디자인 패턴을 적용해보는 것
- 특정한 변경에 대해 일관성 있는 설계를 만들 수 있는 경험 법칙을 모아놓은 일종의 설계 템플릿
- 반복적으로 적용할 수 있는 설계 궂를 제공한다고 하더라도 모든 경우에 적합한 패턴을 찾을 수 있는 것은 아님
휼룡한 구조를 설계하기 위해 따라야 하는 기본 원칙
- 변하는 개념을 변하지 않는 개념으로부터 분리
- 변하는 개념을 캡슐화
조건 로직 대 객체 탐색
변경 주기가 서로 다른 클래스가 하나에 뭉쳐 있으면 좋지 않으며, 일관성있는 협력을 위한 지침을 따르면 좋음
- 변하는 개념을 변하지 않는 개념으로부터 분리
- 변하는 개념을 캡슐화
상속대신 합성을 이용하거나, 리스코프 치환 원칙을 준수해 계층을 구현하는데 상속 활용
캡슐화 다시 살펴보기
캡슐화에 관한 이야기를 들으면 반사저긍로 데이터 은닉(data hiding)을 떠올림.
- 데이터 은닉이란 오직 외부에 공개된 메서드를 통해서만 객체의 내부에 접근할 수 있게 제한함으로써 객체 내부의 상태 구현을 숨기는 기법
- 객체의 모든 인스턴스는 private으로 선언해야 하고 오직 해당 클래스의 메서드만이 인스턴스 변수에 접근할 수 있어야 함.
- 캡슐화란 변하는 어떤 것이든 감추는 것
- 데이터 캡슐화: 인스턴스를 private으로 만들며, 외부 접근은 오직 메서드에 이용하는 것 뿐
- 메서드 켑슐화: 상속에서 자식 클래스에 선언된 메서드의 가시성은 protected(자바) 클래스 외부에서는 이 메서드에 직접 접근 불가하지만 서브 클래스에서는 접근 가능. 내부 행동을 캡슐화
- 객체 캡슐화: 객체와 객체 사이의 관계를 캡슐화
- 서브타입 캡슐화: 서브타입의 종류를 캡슐화 하는게 다형성의 기반이 됨
- 서브타입 캡슐화를 적용하는 두가지 방법
- 변하는 부분을 분리해서 타입 계층을 만들기
- 변하지 않는 부분의 일부로 타입 계층을 합성하기
변경 분리하기
일관성 있는 협력을 만들기 위한 첫 단계는 변하는 개념과 변하지 않는 개념을 분리하는 것
- 구현 요구 사항에 따라서 정책을 정리
- 시간대 및 구견별 금액 > 변하는 부분인 적용 조건
- 단위 요금 > 변하지 않는 부분인 조건
구체적인 협력 구성하기
규칙을 지키는 것보다 어기는 것이 더 어렵다는 것에 주목
- 개발자에게 확장 포인트를 강제하여 정해진 구조를 우회하게 어렵게 만듦
- 재사용성이 향상되고, 테스트해야 하는 코드의 양이 감소
- 유사한 기능에 대해 유사한 협력 패턴을 작성하는 것을 객체 지향 시스템에서 개념적 무결성(Conceptual Integrity)라고 함
지속적으로 개선하라
처음에는 일관성을 유지하는 것처럼 보이던 협력 패턴이 시간이 흐르면서 새로운 요구사항이 추가되는 과정에서 일관성의 벽에 조금씩 금이 가는 경우를 자주 봄. 초기 단계에서 모든 요구사항을 미리 예상할 수 없기 때문에 자연스러운 현상
- 협력은 고정되는 것이 아님.
- 현재 협력 패턴이 변경의 무게를 지태하기 어렵다면 변경을 수용할 수 있는 협력 패턴을 향하 과감하게 라팩토링 진행
- 요구사항의 변경에 따라 협력 역시 지속적으로 개선해야 함.
- 중요한 것은 현재의 설계에 맹목적으로 일관성을 맞추는 것이 아니라 달라지는 변경의 방향에 맞춰 지속적으로 코드를 개선하려는 의지
'it 책 > 오브젝트: 코드로 이해하는 객체지향 설계' 카테고리의 다른 글
오브젝트: 코드로 이해하는 객체지향 설계 나아가기를 읽으며 (0) | 2024.11.25 |
---|---|
오브젝트: 코드로 이해하는 객체지향 설계 15장을 읽으며 (1) | 2024.11.24 |
오브젝트: 코드로 이해하는 객체지향 설계 13장을 읽으며 (1) | 2024.11.21 |
오브젝트: 코드로 이해하는 객체지향 설계 12장을 읽으며 (1) | 2024.11.19 |
오브젝트: 코드로 이해하는 객체지향 설계 11장을 읽으며 (1) | 2024.11.17 |