[오브젝트] 11일차

da__ell·2023년 8월 15일
0

독서 - 오브젝트

목록 보기
11/25
post-thumbnail

p.131 ~ p.141

데이터 중심 설계의 문제점

데이터 중심의 설계가 변경에 취약한 이유

  1. 본질적으로 너무 이른 시기에 데이터에 관해 결정하도록 강요한다.
  2. 협력이라는 문맥을 고려하지 않고 객체를 고립시킨 채 오퍼레이션을 결정한다.

객체의 행동보다는 상태에 초점을 맞춘다.

데이터 주도 설계는 설계를 시작하는 처음부터 데이터에 대한 결정을 강요하기 때문에 나무 이른 시기에 내부 구현에 초점을 맞추는 문제를 갖는다.

데이터 중심의 관점에서 객체는 단순한 데이터의 집합체고 과도한 접근자와 수정자를 추가하고 데이터 객체를 활용하는 절차는 별도의 객체에 구현하게 된다. → 캡슐화의 붕괴

데이터 주도 설계에서 너무 이른 객체의 내부 구현은 객체의 인터페이스를 어지럽히고 객체의 응집도와 결합도에 나쁜 영향일 미치기 때문에 변경에 취약한 코드를 낳는다.

객체를 고립시킨 채 오퍼레이션을 정의하도록 만든다.

객체지향 중심 설계는 협력이라는 문맥 안에서 필요한 책임을 정하고 이를 수행할 적절한 객체를 결정하는 것이 가장 중요하다.
따라서 설계의 중심은 객체의 내부가 아닌 외부에 맞춰져 있어야 한다. → 객체와 다른 객체와 협력하는 방법

데이터 중심 설계는 이에 대한 고민 없이 객체가 관리한 데이터를 결정하고 구현을 진행한다. 이 상태로 협력을 고민하기 때문에 협력이 구현 세부사항에 종속되고 변경에 유연하게 대처하지 못한다.


5. 책임 할당하기

데이터 중심 설계로 발생하는 문제를 해결하는 가장 기본적 방법은 데이터가 아닌 책임에 초점을 만드는 것이다.
이때 가장 큰 어려움은 어떤 객체에 어떤 책임을 할당할지 결정하는 것이다.
동일한 문제를 해결하는 다양한 책임할당 방법이 존재하고 이에 대한 최선은 상황과 문맥에 따라 달라진다. 따라서 올바른 책임을 할당하기 위해 다양한 관점에서 설계를 평가할 수 있어야 한다.

책임주도 설계를 향해

데이터 중심 설계에서 책임 중심의 설게로 전환하기 위해서는 다음 두 가지 원칙을 따라야 한다

  1. 데이터보다 행동을 먼저 결정하라
  2. 협력이라는 문맥 안에서 책임을 결정하라

데이터보다 행동을 먼저 결정하라

객체에게 중요한 것은 외부에 제공하는 행동(책임)이다. 데이터는 객체가 책임을 수행하는 데 필요한 재로를 제공할 뿐이다.

책임 중심의 설계에서는 객체의 행동 즉 책임을 결정한 이후 이 책임을 수행하는 필요한 데이터 (객체의 상태)를 결정한다.

협력이라는 문맥 안에서 책임을 결정하라

협력을 시작하는 주체는 메시지 전송자이기 때문에 적절한 책임이란 메시지 전송자에게 적합한 책임을 뜻한다.
다시 말해, 메시지를 전송하는 클라이언트의 의도에 적합한 책임을 할당해야 한다. 중요한 것은, 메시지가 클라이언트의 의도를 표현한다는 사실이다.

책임 할당을 위한 GRASP 패턴

GRASP는 일반적인 책임 할당을 위한 소프트웨어 패턴의 약자로 객체에게 책임을 할당할 때 지침으로 삼을 수 있는 원칙들의 집합을 패턴 형식으로 정리한 것이다.

도메인 개념에서 출발하기

설계를 시작하기 전 도메인에 대한 개략적인 모습을 그려보자. 도메인에는 많은 개념들이 존재한다. 이 개념들을 책임 할당을 대상으로 사용하면 코드에 도메인을 투영하기 수월하다. 따라서 먼저 책임을 할당할 때 가장 먼저 고민해야할 후보 중 하나가 도메인 개념이다.
설계를 시작할 때에는 이 개념들의 의미나 관계가 정확하거나 명확할 필요가 없다. 단지 책임을 할당할 객체에 대한 정보를 제공하는 것으로 충분하다. 따라서 도메인 개념을 정리하는 데 너무 많은 시간을 들이지 말자.

정보 전문가에게 책임을 할당하라

책임 주도 설계 방식의 첫 단계는 애플리케이션이 제공해야 할 기능을 애플리케이션의 책임으로 생각하는 것이다.
책임을 애플리케이션에 대해 전송된 메시지로 간주하고 이 메시지를 책임질 첫 번째 객체를 선택하는 것으로 설계를 시작하자.

그러면 이 책임을 수행하는데 필요한 메시지를 결정할 때 결정할 것은 메시지를 수신할 객체가 아닌 메시지를 전송할 객체의 의도를 반영해야 한다.

  1. 메시지를 전송할 객체는 무엇을 원하는가?
    협력을 시작하는 객체는 정해지지 않았지만 전송할 객체가 원하는 것을 분명히 파악하고 어떤 메시지를 보낼지 결정한다.
  2. 메시지를 수신할 적합한 객체는 무엇인가?
    객체는 상태와 행동을 통합한 캡슐화의 단위라는 사실에 집중하라. 객체는 자신의 상태를 스스로 처리하는 자율적 존재여야 한다.
    따라서 객체의 책임을 할당하는 원칙으로 책임을 수행할 정보를 알고있는 객체에 책임을 할당하여야 한다.
    → 정보전문가(INFORMATION EXPERT) 패턴

여기서 정보는 데이터와는 다르다. 책임을 수행하는 객체는 책임과 자신의 상태, 정보를 알고 있지만 그 정보를 저장할 필요는 없다는 것을 이해해야 한다.

객체가 메시지를 수신받고 수행해야하는 작업의 흐름은 다음과 같다. 메시지를 받고나서는 외부의 인터페이스가 아닌 수신 받은 객체 내부에서 책임을 수행한다. 이때 메시지를 처리하기 위해 필요한 절차와 구현을 고민하는데, 책임을 수행할 작업만 구분하고 스스로 처리할 수 없는 작업이 무엇인지 가릴 정도면 된다.

스스로 처리할 수 없는 작업은 외부에 도움을 요청한다. 이 요청이 새로운 메시지가 되고 새로운 객체의 책임으로 할당하는 것이다.

정보전문가 패턴은 객체 - 상태와 행동을 함께 가지는 단위 -를 책임 할당의 관점에서 표현한다. 따라서 이 패턴을 따르는 것만으로 자율성이 높은 객체들로 구성된 협력 공동체를 구축할 가능성이 높아진다.

profile
daelkdev@gmail.com

0개의 댓글