- 클래스가 아니라 객체를 바라보는 것
- 객체는 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공동체의 존재
- 객체에게 적절한 역할과 책임을 부여하는 방법 필요
- 유연하면서도 요구사항에 적절한 협력을 설계하는 방법을 알아야함
- 설계와 품질 사이의 다양한 측면에 관해 고민해야함
- 모듈의 존재 이유
- 간단한 작업만으로 변경이 가능해야함
- 변경하기 어려운 모듈은 제대로 동작하더라도 개선해야함
- 특별한 훈련 없이도 개발자가 쉽게 읽고 이해할 수 있어야함
이해 가능한 코드: 우리의 예상에서 크게 벗어나지 않는 코드
- 변경하기 쉬운 객체로 만드는 것
- 개념적이나 물리적으로 객체 내부의 세부적인 사항을 감추는 것
- 캡슐화를 통해 객체 내부로의 접근을 제한하여 결합도를 낮춤
enter() 메서드를 이해하기 위해서는
- Audience가 Bag을 가지고있고
- Bag안에 현금과 티켓이 있으며
- TicketSeller가 TicketOffice에서 티켓을 판매하고
- TicketOffice 안에 돈과 티켓이 보관되어 있다는
모든 사실을 동시에 기억해야 한다는 문제가 있다.
그리고 Audience와 TicketSeller가 변경되면 Theater도 변경되야 한다는 문제
- Audience나 TicketSeller의 내부에 직접 접근하지 않는다.