객체지향 시스템 디자인 원칙
1. 모든게 복잡도 관리다
1.1 객체지향 디자인과 시간이 주는 시련
-
설계가 없는 객체지향 시스템은 단순한 작업조차도 지나치게 어렵게 만듦
-
단순히 객체지향 언어를 사용하는것이 아닌 객체지향을 잘 활용해야함
- 이를 위한 많은 침고들이 존재함
1.2 단순한 객체지향 시스템 디자인
- 복잡성을 줄이거나 그대로 유지하기 위한 작업을 수행하지 않으면 소프트웨어 시스템은 시간이 지남에 따라 복잡성이 증가한다.
- 시간을 투자해서 복잡성 증가를 억게하는것이 중요
- 단순한 객체지향 디자인이란?
- 단순한 코드
- 클래스와 메서드의 크기를 작게 유지
- 일관성 있는 객체
- 잘못된 요청 거부(유효성 검사)해서 일관성 유지?
- 적절한 의존성 관리
- 클래스간 의존성을 최소화
- 좋은 추상화
- 추상화를 통해 적절한 확장을 가능하게 함
- 외부 의존성과 인프라를 적절히 다룸
- 인프라에 대한 세부사항을 도메인으로 부터 분리
- 잘 모듈화된 구조
- 시스템을 작은 컴포넌트로 나누면 이해하기 쉬워짐
- 단순한 코드
- 본 책에서는 위 주제들을 살펴보며 디자인을 단순화하게 만들고 유지하는것을 살펴봄
1.3 일상적인 활동으로서의 단순한 디자인
- 시스템을 진화시키면서 단순하게 유지하기 위해서는 지속적으로 개선하고 단순화해야함
- 복잡성을 줄이기는 개인 위생과 비슷
- 복잡성이 필요할 수도 있지만 영구적이어서는 안됨
- 지속적으로 복잡성을 해결하는 것은 비용 효율적
- 고품질 코드는 좋은 실무 프랙티스를 촉진
- 복잡성 통제는 생각보다 어렵지 않음
- 디자인을 단순하게 유지하는 것은 개발자의 책임
1.4 정보 시스템의 아키텍처에 대해 간한히 살펴보기
2. 코드를 작게 유지하기
2.1 코드 단위를 작게 만들라
- 비즈니스 규칙을 빠르게 반영할때 사용되는 임시방편적인 코드 추가 방식은 이후 유지보수를 어렵게 만듦
2.2 코드를 읽기 쉽게 만들고 문서화하라
2.3 새로운 복잡성을 기존 클래스에서 분리하라
3. 객체의 일관성 유지하기
3.1 항상 일관성을 유지하라
3.3 상태 확인을 캡슐화하라
4. 의존성 관리하기
5. 추상화 잘 디자인하기
6. 외부 의존성과 인프라 다루기
7. 모듈화 달성하기
8. 실용적인 접근법
8.1 실용적으로 접근하되, 딱 필요한 만큼만
- 유지보수가 쉽고 단순한 객체지향 시스템을위해서는 최고의 디자인이 중요함
- 하지만 우리의 주된 목표는 아름다운 디자인이 아니라 효율성
- 좋은 디자인은 목표를 위한 수단일뿐 완벽함과의 사이에서 적절한 균형을 찾는것이 중요
8.2 과감하게 리팩터링하되, 단 작은 단위로 나눠서
- 리팩터링을 멈추면 안됨
- 리팩터링의 필요성을 모를수 있음, 하지만 리팩터링은 수익률 높은 투자
8.3 코드가 완벽하지 않다는 사실을 받아들여라
- 완벽한 코드, 디자인, 아키텍처는 없지만 매일 더 나은 코드를 작성하기 위해 노력해야함