[오브젝트] 5장 - 책임 할당하기
    2022-09-19 10:00
    object

    책임 중심 설계

    • 어떤 객체에게 어던 책임을 할당할지 결정해야한다

    • 문제 해결을 위한 다양한 책임 할당 방법이 존재하며 일종의 트레이드오프 활동이다.

    • 상황과 문맥에 따라 최적의 책임 할당 방법을 선택해야한다.

    • 책임 중심 설계를 위한 원칙

      • 데이터보다 행동을 먼저 결정
        • 중요한 것은 데이터가 아닌 외부에 제공하는 행동 (객체의 책임)
        • 객체가 수행해야 하는 책임이 무엇인지 결정 후, 책임을 수행하는 데 필요한 데이터를 결정
      • 협력이라는 문맥 안에서 책임을 결정
        • 객체 책임의 품질은 협력에 적합한 정도로 결정된다.
        • 책임은 객체 입장이 아니라 객체가 참여하는 협력에 적합해야 한다.
        • 메시지를 전송하는 클라이언트의 의도에 적합한 책임을 할당하라.
        • 메시지가 객체를 선택하게 하라.
    • 메시지를 전송해야 하는데 누구에게 전송해야 하지? 라고 질문

      • -> 메세지 기반 설계
    • 객체를 결정하기 전에 객체가 수신할 메시지를 먼저 결정

      • -> 송신자 관점에서 수신자가 캡슐화됨

    책임 할당 GRASP 패턴

    • 설계 시작시 도메인을 책임 할당의 대상으로 사용하라. (도메인 모델 그리기)
      • 개념들의 의미와 관계가 완벽할 필요 없다.
      • 도메인 개념 정리에 시간투자 X. 설계를 시작하기 위한 개념들의 모음이면 충분
    • 어플리케이션이 제공해야하는 기능 -> 어플리케이션의 책임
    • 책임을 어플리케이션에 대해 전송된 메시지로 간주
      • 메시지를 책임질 첫 번째 객체를 선택하는것으로 책임 주도 설계 시작

    Information Expert 패턴

    • 책임을 수행할 정보를 알고 있는 객체에게 책임을 할당하라.
      • 객체의 책임과 책임을 수행하는데 필요한 상태는 동일한 객체 안에 존재해야 한다.
      • 정보와 행동이 가까이 있으면 캡슐화 유지됨 (응집도 높이고 결합도 낮추고)

    Low Coupling & High Cohesion 패턴

    • 책임을 할당할 수 있는 다양한 대안이 존재한다면 응집도와 결합도 측면에서 더 나은 대안을 선택.

    Creator 패턴

    • 객체를 생성할 책임을 어떤 객체에게 할당할지에 대한 지침을 제공

    • 객체 A를 생성해야 할 때 아래 조건을 최대한 만족하는 B에게 생성 책임을 할당

      • B가 A 객체를 포함하거나 참조
      • B가 A 객체를 기록
      • B가 A 객체를 긴밀히 사용
      • B가 A에 대한 정보 전문가다
    • 클래스 응집도 판단하는 방법 (변경의 이유가 하나 이상인 클래스를 찾는 방법)

      • 변경의 이유를 기준으로 클래스를 분리하라 (SRP)
      • 클래스의 인스턴스를 초기화하는 시점에 경우에 따라 서로 다른 속성들을 초기화하고 있다면 응집도가 낮다는 증거
      • 메서드 그룹이 속성 그룹을 사용하는지 여부로 나뉜다면 응집도가 낮다는 증거

    Polymorphism 패턴

    • 타입을 명시적으로 정의하고 각 타입에 다형적으로 행동하는 책임을 할당하라.
      • 조건문을 사용해 설계하면 변경에 취약한 설계가 된다.
      • 다형성을 이용해 변화를 다루기 쉽게 확장하라

    Protected Varations 패턴

    • 변경될 가능성이 높다면 캡슐화하라.

      • 클래스를 변경에 따라 분리하고 인터페이스를 이용해 변경을 캡슐화하라
      • 결합도와 응집도 향상
    • 처음부터 책임 주도 설계를 따르는 것보다 동작하는 코드를 먼저 작성하고 리팩터링하는 것이 더 훌륭한 결과물을 낳을 수 있다.

      • 객체로 책임을 분배할 때 메서드를 응집도 있는 수준으로 분해하라
      • 자신이 소유하고 있는 데이터를 스스로 처리하도록 메서드를 알맞는 클래스에 배치하라
        • 메서드를 다른 클래스로 이동시킬 때는 인자에 정의된 클래스 중 하나로 이동하는게 일반적

    느낀점

    책임주도 설계를 잘하기란 정말 어렵다. 때문에 책에서도 언급되었듯이 동작하는 코드를 먼저 작성하고 나서 책임주도 설계로 리팩터링 해나가고는 한다.

    하지만 코드의 스멜을 찾기는 생각보다 어려울 수 있고 리팩터링으로 인한 트레이드 오프를 개발자가 인지하지 못 할 수도 있다.

    이러한 이유에서 코드리뷰 문화는 코드의 품질을 높이는데 중요한 요소라고 생각하며 선한 피드백을 주고 받을 수 있는 동료가 될 수 있도록 노력하고 그러한 환경을 만드는데 기여해야겠다.