객체지향의 사실과 오해 -05 책임과 메시지

octofox·2021년 6월 2일
0
post-thumbnail

책임과 메시지

의도는 "메시징"이다. 훌륭하고 성장 가능한 시스템을 만들기 위한 핵심은 모듈 내부의 속성과 행동이 어떤가보다는 모듈이 어떻게 커뮤니케이션하는가에 달려 있다. -앨런 케이

책임감 분산 효과

이 책의 모든 장의 첫부분에서는 생각해 볼만한 실례가 나온다.
이번 사회 실험 책임감 분산과 관련된 내용이다.

이번 실험에 모집된 학생들은 각자 격리된 방에 혼자 앉아 있다가 순서가 되면 마이크를 통해 뉴욕 생활에 대한 어려움을 이야기하기로 되어 있다.

하지만 실제 참가자 본인을 제외한 다른 학생들의 목소리는 미리 녹음된 내용을 틀어줄 뿐이다.
실험에 참가한 피실험자 학생은 다른 학생들이 각자의 방 안에서 실제로 이야기하고 있다고 믿었지만 사실은 녹음기에 녹음된 내용을 듣고있을 뿐이었다.

많은 녹음들이 지나고 한 녹음을 틀어줬는데 이 녹음은 간질을 앓고 있는 학생의 발표였다.
녹음에서는 이윽고 학생이 간질 발작을 일으켜서 괴로워하는 학생의 소리가 나왔다.
실험 참가자는 당황해 했지만 외부와 차단된 독립된 공간에 있었기 때문에 실제로 발작이 일어나는지 확인할 수 는 없었다.

녹음에서는 6분 동안 발작이 계속됬지만 실험에 참가한 대다수의 학생들은 도움 요청을 위한 아무런 행동도 취하지 않았다. 참가자들중 31% 만의 학생들이 외부로 나가 도움을 요청했다.

실험 참가자는 이 괴로운 신음을 듣고 있는 다른 학생들이 많이 있을 것이라 생각하고, 자신 말고 도와줄 학생이 더 있다고 믿었을 때 도움을 요청하지 않았다.

이러한 현상을 책임감 분산 효과라고 한다.

이러한 상황에서 명확한 책임을 가진 권위자가 없을 때 어떤 일이 벌어지는지 잘 보여준다.
명확한 책임이 주어지지 않은 학생은 간질 발작을 일으킨 학생을 도와주는 책임을 타인의 것으로 간주해 버린다.

자율적인 책임

설계의 품질을 좌우하는 책임

자율성: 자기 스스로 원칙에 따라 어떤 일을 하거나 자신을 통제해서 절제하는 특성

타율성: 자신의 의지와 관계없이 정해진 규율이나 원칙에 따라서만 움직이는 특성

객체지향 어플리케이션을 설계하는 가장 널리 알려진 방법을 책임-주도 설계라고 부르는 이유는 적절한 책임의 선택이 전체 설계의 방향을 결정하기 때문이다.

자신의 의지에 따라 증언할 수 있는 자유

엘리스 이야기에서는 왕이 모자 장수에게 한 문장으로 "증언하라"고 명령한다.
하지만 만약 왕이 모자장수에게 더욱 구체적인 명령을 한다면 어떻게 될지 보자.

"증언하라"는 한번의 명령 대신에

"목격했던 장면을 떠올려라"
"떠오르는 기억을 시간 순대로 재구성하라"
"말로 간결하게 표현해라"

이렇듯 왕의 세세한 명령은 모자 장수의 자율성을 상실하게 한다.

모자 장수는 왕에게 증언할 책임은 있지만 증언을 위한 구체적인 방법이나 절차에 대해서는 최대한의 자유를 누려야한다.

모자 장수에게 할당된 증언하라는 책임은 그 자체로 자율성을 충분히 보장할 수 있을 정도로 포괄적이고 추상적이면서도 모자 장수가 해야할 일을 명확히 제시하고 있다.

너무 추상적인 책임

너무 구체적인 것도 문제지만 협력의도를 명확히 표현하지 못할 정도로 추상적인 것 역시 문제다.
왕이 모자 장수에게 단순히 '설명하라' 라고 명령하는 것은 모자 장수가 최대한의 자율성을 가지게 해주지만 조금 모호하다.
하지만 다른 상황에서는 '증언하라' 보다 '설명하라' 가 더 좋은 선택일 수 있다.
최대한 모든 사람이 이해하기 좋은 문맥이 무엇일지 고민해야한다.

'어떻게'가 아니라 '무엇'을

증언한다 라는 책임은 모자 장수가 협력을 위해 무엇을 해야 하는지 결정하지만 어떻게 해야하는 지는 전혀 언급하지 않는다. 요청에서는 어떻게?가 아닌 무엇을? 요청 할지 고려 해야한다.

책임을 자극하는 메시지

객체가 다른 객체에게 접근 할 수 있는 유일 한 방법은 요청을 전송하는 것 뿐이다.
이 요청을 메시지라고 부른다.

메시지와 메서드

메시지

증언하라(어제, 왕국);
모자장수->증언하라(어제, 왕국);
// 수진자, 메시지 이름, 인자의 조합

외부의 객체는 메시지에 관해서만 볼 수 있고 객체 내부는 볼 수 없기 떄문에 자연스럽게 객체의 외부와 내부가 분리된다.

메서드

메시지는 어떻게 수행될 것인지는 명시하지 않는다. 메시지는 단지 오퍼레이션을 통해 무엇이 실행되기를 바라는지만 명시하며, 어떤 메서드를 선탣할 것인지는 전적으로 수신자의 결정에 좌우된다.

다형성

모자장수, 엘리스, 요리사 모두 왕이 전송하는 증언하라 라는 메시지를 자신만의 방법으로 실행 할 수 있다. 다만 수행하는 방법이나 결과는 각기 다를 수 있다.
왕은 '증언하라는' 메시지를 전송하지만 메시지를 수신하는 대상이 모자 장수인지 요리사인지 엘리스인지 알 필요가 없다.
단지 '증언하라' 라는 메시지를 이해하면서 '증인' 역할을 수행할 수 있는 수신자라면 어떤 누구와도 협력 가능하다.

메시지를 따르라

객체지향의 핵심 메시지

객체지향의 강력함은 클래스가 아니라 객체들이 주고 받는 메시지로 부터 나온다.
객체지향 어플리케이션은 클래스를 이용해 만들어지지만, 메시지를 통해 정의된다. 어플리케이션을 살아 있게 만드는 것은 클래스가 아니라 객체다. 객체들이 주고 받는 메시지다.

클래스를 정의하는 것이 먼저가 아니라 객체들의 속성과 행위를 식별하는 것이 먼저다.

다른 객체에게 무엇을 제공해야하고 다른 객체로부터 무엇을 얻어야하는가' 라는 관점에서 접근할 때만 훌륭한 책임을 수확할 수 있다.

what/who 사이클

어떤 행위가 필요한지 먼저 결정 후, 이 행위를 수행할 객체를 결정하는 것이다. 협력에 필요한 메시지를 먼저 결정해라.

묻지말고 시켜라

데메테르 법칙
메시지 중심의 설계는 메시지 수신자의 캡슐화를 증진시킨다.
묻지말고 시켜라 스타일은 객체지향 어플리케이션이 자율적인 객체들의 공동체라는 사실을 강조한다. 모든 객체는 자신의 상태를 기반으로 스스로 결정을 내려야한다.
객체는 다른 객체의 상태를 묻지 말아야한다.

메시지가 어떻게 해야하는지를 지시하지 말고 무엇을 해야하는지 요청하는 것.

책임의 자율성이 협력의 품질을 결정한다.

  1. 자율적인 책임은 협력을 단순하게 만든다.
  2. 자율적인 책임은 객체의 내부와 외부를 명확하게 분리한다.
  3. 책임이 자율적일 경우 책임을 수행하는 내부적인 방법을 변경하더라도 외부에 영향을 미치지 않는다.
  4. 자율적인 책임은 협력의 대상을 다양하게 선택할 수 있는 유연성을 제공한다.
  5. 객체가 수행하는 책임들이 자율적일 수 록 객체의 역할을 이해하기 쉬워진다.
profile
개발자라고 우기는 노답 소년

0개의 댓글