전체의 모든 디테일을 파악하면서 관리할 수 있는 사람은 없다. 대신 각 모듈 수도, 전원 교통 등으로 관리한다. 소프트웨어도 이와 마찬가지로 관리되어야 한다.
- 소프트웨어 시스템은 생성과 사용을 분리해야 한다.
- 소프트웨어 시스템은 관심사에 따라 분리되어야 한다.
- 생성과 사용이 분리되지 않으면 모듈성을 저해하고 코드의 중복을 가져온다.
- Main 분리
- 팩토리 기법
- 의존성 주입
- 모든 생성 관련 로직을 Main(어플리케이션 진입점)으로 옮긴다.
- 어플리케이션에서는 사용할 모든 객체들이 Main에서 잘 생성되었다고 가정한다.
- 객체의 생성 시기를 어플리케이션이 직접 결정하려면 팩토리 객체를 이용한다.
- 어플리케이션에서는 사용할 모든 객체들이 팩토리 객체를 통해 잘 생성되었다고 가정한다.
- 자세한 구현을 숨기고 싶다면 Abstract 팩토리 패턴을 사용한다.
- 필요한 의존성을 외부에서 객체로 전달 받는다.
- 객체가 작업을 수행하는 데 필요한 의존성을 외부에서 제공받는다.
처음부터 거대한 시스템을 목표로 소프트웨어를 설계하고 만들 수 없다. 소프트웨어 시스템은 물리적인 시스템과는 다르게 점진적으로 커질 수 있다.
- 큰 시스템에서는 한 사람이 모든 결정을 내릴 수 없다.
- 결정은 최대한 많은 정보가 모일 때 까지 미룬다.
- 시기가 되면 모듈화된 컴포넌트의 책임자에게 선택을 맡긴다.
- 훨씬 가볍고 직관적인 디자인이 가능하면 그것을 선택한다.
- 표준에 심취해 "고객을 위한 가치 창출"이라는 목표를 잃으면 안된다.