우리 모두를 합친것 보다 더 현명한 사람은 없다 - 켄 블렌차드
우리는 객체를 어떻게 설계하는가?
객체를 설계할 때 어떤 고민을 하는가?
4장의 초입 부분은 전통적인 경제학에서 사람을 “완벽히 이기적인 존재이며 동시에 합리적 존재” 라고 가정한다고 알려준다.
해당 가정이 실제로 맞는지 경제학 게임으로 사회실험을 진행했다.
이 게임을 최후 통첩 게임이라고 부른다.
참가자는 2명인데 하나는 제안자, 하나는 응답자라고 한다.
게임 방법은 이렇다.
연구진이 제안자에게 돈을 준다.
제안자는 그 돈을 응답자와 나누어 가져야한다.
제안자는 돈을 얼마만큼이나 나누어 가질지 제안할 수 있다.
1:9, 5:5, 9:1 얼마든지 가능하다.
다만 응답자가 제안자의 제안을 거절하면 제안자와 응답자 둘 다 한 푼도 손에 쥘 수 없게 된다.
이 게임은 협상의 여지가 없으며 단 한번의 선택으로 게임이 종료된다.
인간이 정말 이기적인 존재라면 제안자는 응답자에게 최소한의 금액을 제시 할 것이다.
하지만 실험에서 대부분 제안자들은 40% 이상을 나누어 가지는 꽤 공평한 제안을 한다.
또한 인간이 지극히 합리적인 존재라면 응답자는 아무리 적은 돈이라도 받아야 하겠지만
응답자의 대부분은 금액의 20%를 제안 받을 경우 제안을 거절했다.
제안자에게서는 인간이 무조건적으로 이기적인지
응답자에게서는 인간이 무조건적으로 합리적인지 알아 볼 수 있는 실험이었다.
실험의 결과는 인간이 “완벽히 이기적인 존재이며 동시에 합리적 존재”라는 가정이 틀렸음을 알려준다.
사람 자체로는 이기적이고 합리적일 수 있다.
하지만 사람과 사람이 관계를 맺는 과정 속에 인간은 본연의 특성을 배제하고 자신의 이익을 최소화하는 불합리한 선택을 하게된다.
하지만 이것이 객체와 무슨 연관이 있나?
결론적으로 인간의 행동은 사람이라는 객체가 어떤 특성을 가지고 있느냐가 결정하지 않고 각 객체가 처해있는 상황과 문맥에 따라 행동방식이 달라진다는 것이다.
객체지향에 갓 입문한 사람들은 객체들간의 협력이라는 문맥을 고려하지 않은 채 객체가 가져야할 상태와 행동 부터 고민하기 시작한다는 것이다.
객체지향에서 중요한 점은 개별 객체가 아니라 객체들 사이에서 이루어지는 협력이다.
협력이라는 것에 초점이 맞추어진 설계는 자연스럽게 객체들의 상태가 결정되게 된다.
협력은 요청 할 때 시작된다.
그리고 응답된다.
협력은 요청과 응답이다.
무엇을 요청할 때 무엇을 응답해야하는지 생각해본다면 더 나은 협력이라는 관점에서 생각 할 수 있다.
요청은 책임을 나타내 준다.
만약 재판을 수행하라는 요청을 받는 객체가 있다면 그 객체의 역할은 무엇인가?
당연히 판사(역할)일 것이다.
그 사람은 재판을 할 충분한 지식과 역량을 갖추고 있기 때문이다.
이처럼 요청은 책임을 나타내준다.
책임은 아는 것, 하는 것으로 결정된다.
적절한 객체에 적절한 책임을 위임하는 것이 객체지향에서 가장 중요한 요소이다.
판사에게 환자를 돌보라고 할 수는 없다.
책임이 불분명한 객체들은 어플리케이션의 품질 또한 불분명하게 만든다.
여기서 잠시 역할과 책임의 차이점을 생각해보자.
역할과 책임의 차이점을 말 할 수 있는가?
책임의 집합이 의미하는 것은 무엇인가?
역할이다.
재판이라는 상황에서는 판사, 변호인, 피해자, 피의자, 증인처럼 다양한 역할들이 나오게 된다.
이들은 하나의 인물이 아니라 누구로든지 대체 될 수 있는 역할일 뿐이다. 왕이 판사를 할 수 도, 혹은 왕이 증인이 될 수 있는 것처럼 역할은 그 상황 안에서 정해진 자리만을 의미한다.
역할을 수행하는 객체가 바뀌어도 이 재판 상황과 재판을 수행하는 메커니즘은 바뀌지 않는다.
어떠한 것이 들어와도 바뀌지 않는 것은 추상화가 가능하다.
일례로 전 세계의 모든 재판은 일련의 공통점을 가지고 있다.
우리는 재판이라는 상황 속에서 역할에 따라 객체들이 협력하는 상황들을 추상화 할 수 있다.
역할이라는 것을 추상화 할 수 있다니… 재판, 커피 주문, 해외 여행 이러한 일련에 묶어진 역할의 연속들을 추상화 할 수 있다.
이제 이상한 질문을 해보겠다.
이상한 나라의 엘리스에서 판사의 역할을 맡을 책임을 가진 객체는 누구인가?
왕이었다.
역할과 책임의 의미는 많이 다르다
위의 질문이 이제 이해가 되는 듯 하다.
올바른 객체를 설계하기 위해서는 먼저 견고하고 깔끔한 협력을 설계해야 한다.
다시 말해 객체들이 주고 받을 요청과 응답의 흐름을 정리해야 한다는 것이다.
위 세가지는 효과적으로 객체를 설계하기 위한 기법들이다.
자세한 설명은 추후에 적어보도록 하겠다.