flagtags / OOP-study

0 stars 0 forks source link

4장. 역할, 책임, 협력 #4

Open kkirico opened 8 months ago

kkirico commented 8 months ago

역할 책임 협력

협력이라는 문맥을 먼저 고려해야한다.

객체를 따로 떼어놓고 봤을 때는 기묘하고 비협력적이여도, 조화를 이루며 적극적으로 협력하는 객체를 창조해야한다.

객체지향 설계의 품질을 결정하는 역할, 책임, 협력 개념에 대해 아라보자

협력

요청하고 응답하며 협력하는 사람들

어떤 등장인물들이 특정한 요청을 받아들일 수 있는 이유는 그 요청에 대해 적절한 방식으로 응답하는 데 필요한 지식과 행동 방식을 가지고 있기 때문이다.

요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다.

책임

책임의 분류

책임은 객체에 의해 정의되는 응집도 있는 행위의 집합이다.

객체의 책임은

책임은 객체의 외부에 제공해 줄 수 있는 정보와 외부에 제공해줄 수 있는 서비스의 목록이다.

따라서 책임은 객체의 공용 인터페이스를 구성한다.

책임과 메시지

한 객체가 다른 객체에게 전송한 요청은 요청을 수신한 객체의 책임이 수행되게 한다.

책임과 메시지의 수준은 같지 않다

책임은 객체가 협력에 참여하기 위해 수행해야하는 행위를 상위 수준에서 개략적으로 서술한 것이다.

하나의 책임은 여러 메시지로 분할되는 것이 일반적이다.

역할

책임의 집합이 의미하는 것

역할

역할은 협력 내에서 다른 객체로 대체할 수 있음을 나타내는 일종의 표식이다.

동일한 역할을 수행하는 객체들이 동일한 메시지를 수신할 수 있기 때문에 동일한 책임을 수행할 수 있다.

역할을 통해 단순성, 유연성, 재사용성을 뒷받침 할 수 있다.

협력의 추상화

역할을 통해 협력을 추상화 할 수 있다.

대체 가능성

객체는 역할이 암시하는 책임보다 더 많은 책임을 가질 수 있다.

객체의 모양을 결정하는 협력

흔한 오류

시스템에 필요한 데이터를 저장하기 위해 객체가 존재한다? → 행위를 수행하며 협력에 참여하기 위해 객체가 존재한다.

객체지향이 클래스와 클래스간의 관계를 표현하는 시스템의 정적인 측면이 중요하다? → 협력에 참여하는 동적인 객체가 중요하다.

협력에 따라 흐르는 객체의 책임

견고하고 깔끔한 협력을 설계하라

협력에 필요한 책임을 결정 분배 하고

객체에게 책임을 할당한다.

객체지향 설계 기법

책임-주도 설계

협력에 필요한 책임들을 식별하고 적합한 객체에게 책임을 할당한다.

디자인 패턴

특정 문제를 해결하기 위해 이미 식별해 놓은 역할, 책임, 협력의 모음이다.

테스트-주도 개발

구체적인 코드를 작성해 나가면서 역할, 책임, 협력을 식별하고 식별된 역할, 책임, 협력이 적합한지 피드백 받는다.

역할은 객체보다 추상화 된 개념인가? -yes

j03y14 commented 8 months ago

개인이 처해있는 문ㅂ맥에 따라 인간의 행동방식이 결정된다. 객체도 협력이라는 문맥이 행동방식을 결정한다.

협력을 생각하고, 행동이 드러나고 상태가 결정된다.

협력

협력은 요청과 응답으로 연결되는 사람들의 네트워크이다.

모든 객체들은 동일한 목적을 달성하기 위해서 협력하고 있다.

특정한 요청을 받아들일 수 있는 이유는 그 요청에 적절하게 응답하는데 필요한 지식을 가지고 있기 때문이다. 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다.

책임

어떤 대상에 대한 요청은 대상이 요청을 처리할 책임이 있음을 알게된다.

책임은 무엇을 아는가와 무엇을 할 수 있는가로 구성된다.

첵임은 외부에서 접근 가능한 서비스의 관점에서 이야기한다.

책임과 메세지

책임을 결정한 후에 실제로 협력을 정제하면서 메세지로 변환할 때는 하나의 책임이 여러 메세지로 분할되는 것이 일반적이다.

역할

책임의 집합을 역할을 암시한다. 역할을 사용해서 각각의 협력을 모두 포괄하는 하나의 협력을 주상화 할 수 있다. 역할은 협력 내에서 다른 객체로 대체할 수 있음을 나타내는 표식이다.

같은 역할을 수행하는 객체는 동일한 메세지를 이해할 수 있다. 즉, 동일한 책임의 집합을 수행할 수 있다.

협력의 추상화 및 대체 가능성

객체의 모양을 결정하는 협력

객체를 문맥을 고려하지 않고 설계하면 안된다. 객체가 참여하는 협력을 우선적으로 고려해야한다.

먼저 요청과 응답의 흐름을 결정하고, 객체가 협력에 참여하기 위해 수행될 책임이 정해진다. 책임을 할당하고 나면 책임은 객체가 외부에 제공할 행동이 된다. 행동이 결정된 후에 데이터를 고민하고, 행동과 데이터가 결정된 후에 클래스 구현 방법을 결정한다.

객체지향 설계 기법

책임주도 설계

디자인 패턴

테스트 주도 개발

kkirico commented 8 months ago

재윤Q. "협력관계를 먼저 정하라" 협력을 통해 책임들을 정의하고 책임들의 모음으로 역할 혹은 객체를 만들어서 설계를 하라

협력을 한다는 자체가 요청자와 수신자를 분리해야하는건데, 그러면 역할 정의가 수반되어야 하지 않는가?

헌준A. 최초에 인식되는 객체가 있을것이고 그를 통해 협력 -> 책임 -> 역할 순서로 설계한다. ?? 하지만, 이런 내용은 책에 없었음...

재윤A. 너무 법칙처럼 접근하는게 아니고, 협력이 중요함을 인식하고, 시스템 책임을 정의하고 책임을 분할하고... 하는 부분에서 협력을 고려해야 한다는 문맥으로 이해하면 되는 걸까 싶음

kkirico commented 8 months ago

헌준 Q 테스트 주도 개발이 어떻게 객체 지향 설계지?

재윤A

  1. 테스트를 통해 인터페이스를 먼저 정한다 객체가 어떤 메시지를 받아서 응답하는지를 테스트 하는 것 그를 통해 해당 객체가 어떻게 협력하는지를 먼저 정의하게 된다.

  2. 큰 테스트를 먼저 정의하고 쪼개나가는 부분도, 책임-주도 설계와 맞닿아 있다

kkirico commented 8 months ago

객체의 세계에서도 협력이라는 문맥이 중요하다. 협력은 요청과 응답으로 이루어지는데, 수신자가 어떤 요청을 받을수 있다는 것은 즉 수신자가 책임을 수행한다는 의미이다. 수신자가 가진 책임의 집합을 역할이라고 표현한다. 역할을 통해 동일한 역할을 수행하는 객체가 대체 가능한 개념이 된다.

객체가 어떤 역할과 책임을 가지는 지는 객체가 어떤 협력 관계 속에 있는지에 따라서 결정된다.