역할, 책임, 협력

로롱이·2022년 7월 25일
0

오브젝트

목록 보기
3/5

협력

  • 객체간의 상호작용
  • 다른 객체한테 메시지 전송을 한다.

책임

  • 객체가 협력에 참여하기 위해 수행하는 로직

역할

  • 객체들이 협력 안에서 수행하는 책임들이 모여 객체가 수행하는 역할

어떤 객체도 섬이 아니다

  • 애플리케이션 안에 어떤 객체가 필요하다면 그 이유는 단 하나여야 한다.

Movie 영화라는 단어를 들었을 때 대부분의 사람들은 극장에서 영화를 상영하는 장면을 상상할 것이다.

그렇지만 영화 예매 협력안에서는 Movie객체는 play라는 메서드는 없다.
요금 계산에 대한 책임만 있을 뿐이다.
즉 Movie의 행동을 결정하는 것은 영화 예매를 위한 협력이다.
중요한것은 협력이라는 문맥을 고려해서 객체를 설계해야 한다. 그렇지 않으면 엉뚱한 책임만을 가질 뿐이다.

객체에게 책임을 할당하기 위해

하는 것

  • 객체를 생성하거나 계산을 수행하는 등의 스스로 하는 것
  • 다른 객체의 행동을 시작시키는 것
  • 다른 객체의 활동을 제어하고 조절하는 것

아는 것

  • 사적인 정보에 관해 아는 것
  • 관련된 객체에 관해 아는 것
  • 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것

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

적절한 협력이 적절한 책임을 제공한다.

중요한 것은 협력이라는 문맥 안에서 먼저 생각하고 그 후 적절한 책임(하는 것, 아는 것)을 객체에게 분배하자. 그 후 구현방법은 천천히 해도 늦지 않다.

  • CRC 카드 (후보, 책임, 협력자)

메시지가 객체를 결정한다는 것
행동이 상태를 결정한다는 것


  1. 객체 설계 시 먼저 협력이라는 문맥을 생각하자
  2. 그 후 메시지를 정의하고 적절한 책임을 가진 객체를 선택하자
  3. 적절한 객체를 선택했으면 메시지에 대한 행동을 정의하고 적절한 상태를 결정하자 (비즈니스 로직을 정의하고 프로퍼티를 만들자)
  4. 만약 이 과정에서 다른 객체가 필요하면 추상화된 메시지를 사용해서 다른 객체에게 요청하자
  5. 요청을 받은 객체들은 적절한 응답을 할 책임을 가지지만 객체 스스로가 판단해서 응답하게 하자 (다른 객체에서 내부로 접근을 못하게 막자)

메시지가 객체를 결정한다

메시지가 객체를 선택해야 하는 이유
1. 객체가 최소한의 인터페이스를 가질 수 있게 된다.
2. 객체는 충분히 추상적인 인터페이스를 가질 수 있게 된다. ('어떻게' 보다는 '무엇을'로 표현하자 좀 더 추상적으로)

행동이 상태를 결정한다

객체의 행동을 정의하고 그에 적절한 상태를 결정하자
보통 적절한 상태를 생각해놓고 행동을 정의하면 내부 구현이 객체의 외부로 공개되도록 만들기 때문에 캡슐화를 저해한다.

상태는 단지 객체가 행동을 정상적으로 수행하기 위해 필요한 재료일 뿐이다.

중요한 것은 객체의 상태가 아니라 행동이다!
협력이 객체의 행동을 결정하고 행동이 상태를 결정한다.

역할과 협력

객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합을 역할이라고 부른다. 쉽게 생각해 추상화된 형태다.
문제를 해결하기 위해서는 객체가 아닌 책임에 초점을 맞춰야 한다.
AmountDiscountPolicy와 PercentDiscountPolicy 모두 할인에 대한 동일한 책임을 수행한다.
따라서 객체라는 존재를 지우고 할인 요금을 계산하라는 추상화된 슬롯이 필요한데 이 슬롯이 바로 역할이다. DiscountPolicy
중요한 것은 일단 협력 안에서 역할이 어떤 책임을 수행해야 하는지를 결정하는 것이 중요하다.

역할은 객체를 추상화해서 객체 자체가 아닌 협력에 초점을 맞출 수 있게 한다. 역할은 객체가 참여할 수 있는 일종의 슬롯이다.

객체 대 역할

협력에 적합한 책임을 수행하는 대상이 한 종류라면 간단하게 객체로 간주한다. 만약 여러 종류의 객체들이 참여할 수 있다면 역할이라고 부르면 된다.

profile
모두 화이팅!

0개의 댓글

관련 채용 정보