읽은 책 정리/객체지향의 사실과 오해

04 역할, 책임, 협력

포포015 2021. 9. 15. 11:57

최후 통첩게임 실험

이야기의 내용은 인간의 본질적인 특성은 합리적이고, 이기적이다 라고 한다.

 

하지만 최후 통첩게임 실험에서는 인간은 본질적인 특성이 아니라, 어떤 상황에 처해 있느냐가 인간의 행동을 결정한다.

  • 협력에 얼마나 적절한지에 따라, 행동의 적합성이 결정되며 협력이라는 문맥이 인간의 행동방식을 결정한다.
  • 객체도 동일하게 협력이라는 문맥이 객체의 행동방식을 결정하게된다.
  • 초보자들의 실수는 협력이라는 문맥을 고려하지않은채 객체가 가져야할 상태와 행동부터 고민한다.

중요한것은 개별 객체 별로 바라보지말고 핵심은 객체들 사이의 협력이다.

어떤 협력에 참여하는지가 객체에 필요한 행동을 결정하고, 필요한 행동이 객체의 상태를 결정한다.

 

 

협력

우리가 직면하게 되는 문제는 혼자만의 힘으로 해결하기 어렵기떄문에, 해결과정에 여러사람이 참여하게 된다.

(요청과 응답의 연쇄적인 흐름)

 

  • 협력은 한사람이 다른사람에게 도움을 요청 할때 시작된다.                                                                     (요청을 받은사람이 일을 처리한후, 요청한사람에게 요청에 대해 응답한다.)
  • 요청을 수행하던중 어려운 문제를 직면시 또 다른 사람에게 도움을 요청해서 해결한다.                                      (전체적으로 협력은 다수의 연쇄적인 요청과 응답의 흐름으로 구성된다.)

앨리스의 이야기에 나오는 재판에 대한 이야기도 <왕>과 <하얀토끼>와 <모자 장수>도 협력관계이다.

왕은 재판을 진행하는중, 증언 하라 라는 요청에 대해 하얀토끼가 모자장수를 불러와서, 모자장수가 증언하는 협력관계

 

책임

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

 

객체지향 세계에서는 어떤 객체가 어떤 요청에 대해 대답할수 있거나,

적절한 행동을 할 의미가 있는경우해당객체가 책임을 가진다 라고 말한다.

 

* 객체지향 개발에서 가장 중요한 능력은 책임을 능숙하게 소프트웨어 객체에 할당하는것이다.

 

객체지향 설계의 예술은 적절한 객체에게 적절한 책임을 할당하는데 있다.

(책임이 불분명한 객체들은 애플리케이션 미래역시 불분명하게 만든다.)

(명확한 책임이 애플리케이션의 미래를 결정 짓는다.)

 

-> 설계를 시작하는 초반에는 어떤객체가 어떤책임을 가지고

어떤방식으로 서로 협력해야하는지에 대한 개요를 아는것만으로 충분하다.

(책임과 협력의 구조가 자리를 잡기 전까지는 책임을 구현하는 방법에 대한 고민은 잠시 뒤로 미루자.)

 

예로 들자면, 재판이라는 협력에 왕과 모자장수가 상호 협력해야하고, 이를위해 '증언하라' 라는 메시지를 송신하고,

수신할수 있다는것을 결정하는게 제일중요하다.

(어떤 클래스가 필요하고 어떤 메서드를 포함해야하는지 결정은 나중이다.)

 

역할이 답이다

'판사' '증인' 이라는 역할을 사용하면 협력을 모두 포괄할수 있는 하나의 협력으로 추상화 할수있다.

 

역할

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

(역할은 해당 역할을 수행할수 있는 어떤객체라도 대신할수 있음을 의미한다.)

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

(재사용성, 유연성, 단순성을 뒷받침하는 핵심이 역할이다.)

 

역할은 추상화 함으로써, 하나의 협력안에 여러 종류가 객체에 참여할수 있다.

예로들자면 '판사' '증인' 이라는 추상화로 인해 판사는 <왕>이 대체할수도 있고, <왕비>가 대체할수도있다.

증인또한 <모자장수>가 될수 있고, <앨리스>가 될수있다. 이로인해 재사용성이 높고, 유연하고, 단순하다.

 

객체가 역할을 대체하기 위해서는 행동이 호환되야 한다.

(협력안에서 역할이 수행할수 있는 행동을 그대로 수행할수 있어야한다.)

 

 

일반화/ 특수화 관계

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

 

일반적인 개념을 의미하는건 일반화이며 (추상적)

좀더 구체적인 개념을 의미하는 객체의 타입은 특수화이다 (구현체)

핵심은 역할의 대체가능성은 '행위 호환성'을 의미하고, 행위호환성은 '동일한 책임'의 수행을 의미한다.

 

 

정리

올바른 객체를 설계하기 위해서는 먼저 견고하고 깔끔한 협력을 설계해야한다.

(설계에 참여하는 객체들이 주고받을 요청과 응답의 흐름을 결정하는것.)

 

객체에게 책임을 할당하고 나면 책임은 객체가 외부에 제공하게 될 행동이된다.

(행동을 결정한후에 그 행동을 수행하는데 필요한 데이터를 고민해야한다.)

 

마지막으로 제일중요한것은, 객체가 충분히 자율적인 동시에 충분히 협력적인 객체를 창조하는것이다.

(객체지향 설계 기법에선 크게 3가지가있다.)

  1. 책임 - 주도 설계
  2. 디자인패턴
  3. TDD(테스트주도개발)

 

'읽은 책 정리 > 객체지향의 사실과 오해' 카테고리의 다른 글

06 객체 지도  (0) 2021.09.15
05 책임과 메시지  (1) 2021.09.15
03 타입과 추상화  (0) 2021.09.12
02 이상한 나라의 객체  (1) 2021.09.11
01 협력하는 객체들의 공동체  (0) 2021.09.10