객체 지향 설계 역할, 책임, 협력 중 가장 중요한 것은 `책임`이다. 책임을 할당하는 작업이 응집도와 결합도 같은 설계 품질과 연관되어 있다. 객체들의 책임이 적절히 할당되지 못한다면 원활한 협력을 기대할 수 없으며 역할은 책임의 집합이기 때문에 역할 역시 협력을 이루지 못한다. 설계란 변경을 위해 존재하며 훌륭한 설계란 합리적인 비용안에서 변경을 수용할 수 있는 구조를 만드는 것이다. 이를 위해서는 객체의 상태가 아닌 행동에 초점을 맞춰야 한다. 객체를 단순한 데이터의 집합으로만 본다면 내부 구현을 퍼블릭 인터페이스에 노출되어 변경에 취약해진다. 이번장에서는 데이터 중심의 설계를 보고 객체지향적 설계와의 차이점을 살펴본다. 두 가지 시스템 객체 분할 방법 상태(데이터) 기준 분할 - 데이터를 조작하는..
객체지향 패러다임 관점에서의 핵심 역할: 객체들이 애플리케이션의 기능구현을 위해 수행하는 상호 작용. 책임: 객체가 협력에 참여하기 위해 수행하는 로직. 협력: 수행하는 책임들이 모여 객체가 수행하는 구성. 협력 객체 지향에서의 객체는 고립된 존재가 아닌 애플리케이션 기능을 수행하기 위해 다른 객체와 협력하는 사회적 존재. public class Screening { private final Movie movie; public Reservation reserve(Customer customer, int audienceCount) { return new Reservation(customer, this, calculateFee(audienceCount), audienceCount); } private Mon..
영화 예매 시스템 영화는 영화에 대한 기본 정보를 의미한다. - 제목, 상영시간, 할인정책, 할인조건 상영은 관람객이 영화를 관람하는 정보를 의미한다. (실제 관람객이 예매하는 대상) 할인 조건에 따른 할인 정책이 존재한다. 할인 조건 순서 조건 상영 순번을 이용해 할인 여부를 결정. 기간 조건 상영 시작시간이 특정 기간인 경우 할인 여부 결정. 할인 정책 금액 할인 정책 예매 금액에서 일정 금액을 할인해 주는 방식. 비율 할인 정책 예매 금액에서 일정 비율의 금액을 할인해 주는 방식. 객체 지향 설계의 초점 클래스를 고민하기전에 어떤 객체가 필요한지부터 고민하라. (도메인 결정을 먼저하라는 의미인듯?) 객체를 독립적인 존재가 아닌 협력하는 공동체의 일원으로 생각하라. (각 객체는 자율적인 존재) 영화 ..
티켓 판매 어플리케이션 공연장의 공연을 보기 위해서 관람객은 티켓이 필요하다. 이벤트를 진행하는데 관람객이 초대권을 가지고 있을경우 무료로 관람 가능하다. 초대권이 있을경우 초대권을 교환하여 입장가능하며 없을경우 돈을 지불하고 입장 가능하다. 개선 전 소스 관람객의 경우 소유금액, 티켓, 초대권을 가지고있는 가방을 소유하고있다. /** * 관람객 도메인 클래스 * 소지품을 보호하기 위해 가방을 소지한다. */ @RequiredArgsConstructor @Getter public class Audience { private final Bag bag; } /** * 관람객의 가방을 나타내는 도메인 오브젝트 */ public class Bag { /** * 보유 금액 */ private Long amount..