설계(Design)란?

코드를 배치하는 방식을 말하며 객체지향 설계를 이해하기 위한 첫 걸음은 객체지향의 모든 원칙은 변경을 중심에 두고 있다는 사실을 이해해야함

객체지향 설계 원칙

  1. 협력에 필요한 행동을 먼저 결정하고 행동에 적합한 객체를 나중에 선택하라

    1. 2번 원칙을 통해 1번 원칙을 유도할 수 있음

    즉, 다른 객체의 요청을 처리하기 위해 필요한 행동을 먼저 결정하고 행동에 적합한 객체를 나중에 선택한다!

    여기에서 강조하고 싶은 점은 클래스를 고립시킨 상태에서 외부에 제공할 행동을 결정 해서는 안된다는 것!

    객체는 다른 객체가 사용할 필요가 있는 행동을 외부에 제공해야 함

    객체가 어떻게 사용될지 고민하지 않고 고립된 상태에서 행동을 결정하면 문맥을 고려하지 않고 데이터를 설계 했던 절차적인 설계와 유사한 문제가 발생함

    b. 협력에 필요한 요청에서 행동을 결정

    클라이언트의 요청을 먼저 결정한 후에 이 요청을 처리할 객체를 나중에 선택해야함

    image.png

    image.png

    이렇게 객체가 다른 객체에게 도움을 얻기 위해 요청하고 응답하는 과정을 협력이라고 함!

  2. 객체의 행동을 먼저 구현하고 행동에 필요한 데이터를 나중에 선택하라

    1. 데이터가 아닌 행동에 초점 (데이터라는 존재 자체를 부시해라!)

      이때 데이터에 대해서는 고려하지 않은채 객체가 외부에 제공해야하는 행동만 고민해야함

      image.png

    2. 할인 금액을 먼저 생각해라

    이때 calculateDiscount 메서드를 구현하다보면 할인 금액을 저장할 Amount나 비율을 저장할 %라는 데이터가 필요하다는 사실을 알게 됨

    image.png

    image.png

    이렇게 메서드를 구현하면서 필요하다고 판단된 데이터를 나중에 추가하면, 내부의 데이터가 변경되더라도 외부의 클라이언트가 영향을 받지 않게 되기 때문에 DiscountPolicy를 수정하기가 쉬워진다.

    여기서 DiscountPolicy에 calculateDiscount메서드를 추가한 이유는 외부의 ReservationService 객체가 할인 금액을 계산하기 원했기 때문임!

객체지향 설계 순서

객체 협력(런타임)에서 클래스 구조(컴파일 타임)의 순서로 진행

image.png