책임에 초점을 맞춰 설계할 때 가장 큰 문제는 어떤 객체에게 어떤 책임을 할당할지 결정하는 것이다. 이 과정은 일종의 트레이드오프 활동이고 무엇이 최선인지는 상황과 문맥에 따라 달라진다.
다음 두 가지 원칙이 있다.
객체에게 중요한 것은 데이터가 아니라 외부에 제공하는 행동, 즉 객체의 책임이다. 앞서 말했듯 데이터에 초점을 맞추면 캡슐화가 약화되고 낮은 응집도, 높은 결합도라는 문제를 야기할 수 있다.
고로 설계에서는 "이 객체가 수행해야 하는 책임을 무엇인가?"를 결정한 후 "이 책임을 수행하는데 필요한 데이터는 무엇인가?"를 결정해야 한다.
그래서 객체에게 책임을 어떻게 할당해야 할까? 어떻게 해야 잘한걸까?
책임의 품질을 협력에 적합한 정도로 결정된다. 객체의 입장에서는 책임이 조금 어색하더라고 협력에 적합하다면 그 책임은 좋은것이다. 객체의 입장이 아니라 객체가 참여하는 협력에 적합해야 한다.
그리고 협력을 시작하는 주체는 수신 객체가 아니라 전송 객체다. 고로 협력에 적합한 책임이란 메시지 전송자에게 적합한 책임을 말한다. "메시지를 전송해야 하는데 누구에게 전송하지?" 라는 질문에서 시작하자. 이렇게 설계할 경우 메시지 수신자에 대한 어떠한 가정도 할 수 없다. 전송자의 관점에서 메시지 수신자가 깔끔하게 캡슐화된다는 장점이 있다.
GRASP = "General Responsibility Assignment Software Pattern" = 일반적인 책임 할당을 위한 패턴 그저 앞서 1~4장에 다룬 기반 지식을 서로 공유하고 토의할 수 있게 이름을 붙인 것이다.