5장 - HONGDAE-OBJECT/OOP GitHub Wiki
- 데이터 중심의 설계에서 책임 중심으로 초점을 맞춰야 한다.
- 데이터보다 행동을 먼저 결정하라.
- 요구사항을 이해한다.
- 협력이라는 문맥 안에서 책임을 결정하라.
- 요구사항을 해결할 수 있는 패키지 클래스 기능을 결정한다.
- 아직 객체지향은 아님
- 책임 주도 설계
- 만족할때까지 반복적으로 클래스와 객체를 리펙토링 한다. 동작하는 코드로 행동과 책임이 맞는지 확인한다.
협력, 책임, 메세지
- https://vandbt.tistory.com/9
- 도메인 개념에서 출발하기
- 정보전문가에게 책임을 할당하라
- 메세지를 전송할 객체는 무었을 원하는가.
- 기능
- 메세지를 수신할 적합한 객체는 누구인가.
- 기능과 기능에 필요한 멤버 변수와 객체를 가지고 있는 객체
- 메세지를 전송할 객체는 무었을 원하는가.
- 높은 응집도와 낮은 결합도
- 응집도 : 하나의 모듈안에 있는 기능들의 연관성
- 결합도 : 둘 이상의 모듈의 연관성
- 창조자에게 객체 생성 책임을 할당하라
- CREATOR 패턴의 가정이 충족되면 A 는 B 의 private(정보은닉)대상이다.
- DiscountCondition 개선하기
- 새로운 할인 조건 추가
- 순번 조건을 판단하는 로직 변경
- 기간 조건을 판단하는 로직이 변경되는 경우
- 타입 분리하기
- 타입 : 객체를 구분할 수 있는 정보
- 객체를 식별하고 객체에 맞는 기능을 수행하기 위한 기준
- 다형성을 통해 분리하기
- 다형성 : 기능을 정의되지만 세부 구현은 다양하게 할수 있는 성질
- if else 를 줄이기 위함
- 변경으로부터 보호하기
- Movie 클래스 개선하기
- 도메인의 구조가 코드의 구조를 이끈다.
- 도메인의 이해 = 요구사항의 이해
- 도메인의 구조가 코드의 구조를 이끈다.
- 변경과 유연성
- 예제는 그럴 듯 하지만 실무는 더 단순해야 한다.
- 데코레이터 패턴. 프록시 패턴
-
메서드 응집도
- 리펙토링
-
객체를 자율적으로 만들자
- 낮은 결합도와 높은 응집도
- 무조건 private 로 시작한다.
- 할인 조건을 계산하는데 필요한 모든 로직이 DiscountCondition 모여 있다.
-
POLYMORHISM 패턴 (폴리모피즘)
- 인터페이스를 결정하고 인터페이스를 구현한 객체를 실행한다.
- 객체의 타입에 따라 변하는 로직을 IF ELSE 없이 구분 실행 가능하다.
-
PROTECTED VARIATONS 패턴
- 변경이 될 가능성이 높으면 캡슐화 하라.
- private 를 통해 변경의 범위를 한정하자.
public class ReservationAgency {
public Reservation reserve(Screening screening, Customer customer, int audienceCount) {
boolean discountable = checkDiscountable(screening);
Money fee = calculateFee(screening, discountable, audienceCount);
return createReservation(screening, customer, audienceCount, fee);
}
나머지는 전부 private - 코드 가독성 개선
private boolean isSatisfiedByPeriod(Screening screening) {
return screening.getWhenScreened().getDayOfWeek().equals(dayOfWeek)
&& startTime.compareTo(screening.getWhenScreened().toLocalTime()) <= 0
&& endTime.compareTo(screening.getWhenScreened().toLocalTime()) >= 0;
}
private boolean isSatisfiedByPeriod(Screening screening) {
if (!screening.getWhenScreened().getDayOfWeek().equals(dayOfWeek)) {
return false;
}
if (!(startTime.compareTo(screening.getWhenScreened().toLocalTime()) <= 0)) {
return false;
}
if (!(endTime.compareTo(screening.getWhenScreened().toLocalTime()) >= 0)) {
return false;
}
return true;
}- 질문 의사소통의 도구로 인터페이스가 필요할까?
사각형 예제

