5장 - HONGDAE-OBJECT/OOP GitHub Wiki

5 책임 할당하기

  • 데이터 중심의 설계에서 책임 중심으로 초점을 맞춰야 한다.

5.1 책임 주도 설계를 향해

  • 데이터보다 행동을 먼저 결정하라.
    • 요구사항을 이해한다.
  • 협력이라는 문맥 안에서 책임을 결정하라.
    • 요구사항을 해결할 수 있는 패키지 클래스 기능을 결정한다.
    • 아직 객체지향은 아님
  • 책임 주도 설계
    • 만족할때까지 반복적으로 클래스와 객체를 리펙토링 한다. 동작하는 코드로 행동과 책임이 맞는지 확인한다.


협력, 책임, 메세지

5.2 책임 할당을 위한 GRASP 패턴

  • https://vandbt.tistory.com/9
  • 도메인 개념에서 출발하기
  • 정보전문가에게 책임을 할당하라
    • 메세지를 전송할 객체는 무었을 원하는가.
      • 기능
    • 메세지를 수신할 적합한 객체는 누구인가.
      • 기능과 기능에 필요한 멤버 변수와 객체를 가지고 있는 객체
  • 높은 응집도와 낮은 결합도
    • 응집도 : 하나의 모듈안에 있는 기능들의 연관성
    • 결합도 : 둘 이상의 모듈의 연관성
  • 창조자에게 객체 생성 책임을 할당하라
    • CREATOR 패턴의 가정이 충족되면 A 는 B 의 private(정보은닉)대상이다.

5.3 구현을 통한 검증

  • DiscountCondition 개선하기
    • 새로운 할인 조건 추가
    • 순번 조건을 판단하는 로직 변경
    • 기간 조건을 판단하는 로직이 변경되는 경우
  • 타입 분리하기
    • 타입 : 객체를 구분할 수 있는 정보
    • 객체를 식별하고 객체에 맞는 기능을 수행하기 위한 기준
  • 다형성을 통해 분리하기
    • 다형성 : 기능을 정의되지만 세부 구현은 다양하게 할수 있는 성질
    • if else 를 줄이기 위함
  • 변경으로부터 보호하기
  • Movie 클래스 개선하기
    • 도메인의 구조가 코드의 구조를 이끈다.
      • 도메인의 이해 = 요구사항의 이해
  • 변경과 유연성
    • 예제는 그럴 듯 하지만 실무는 더 단순해야 한다.
    • 데코레이터 패턴. 프록시 패턴

5.4 책임 주도 설계의 대안

  • 메서드 응집도

    • 리펙토링
  • 객체를 자율적으로 만들자

    • 낮은 결합도와 높은 응집도
    • 무조건 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;
}
  • 질문 의사소통의 도구로 인터페이스가 필요할까?

사각형 예제

https://www.google.com/amp/s/jaewanlife.wordpress.com/2012/11/05/source-reuse%25EB%25A5%25BC-%25EC%259C%2584%25ED%2595%259C-%25EB%25B0%25A9%25EB%25B2%2595-%25EB%25AA%25A8%25EB%2593%2588-%25EA%25B0%259D%25EC%25B2%25B4-%25EC%25BB%25B4%25ED%258F%25AC%25EB%2584%258C%25ED%258A%25B8/amp/

⚠️ **GitHub.com Fallback** ⚠️