본문 바로가기
👨‍👩‍👦‍👦 OOP

📔 역할, 책임, 협력 (객사오 4장)

by kukim 2021. 11. 25.

객체지향을 설계의 핵심은 협력, 책임, 역할이다.

협력

협력이란 객체들 사이에 요청과 응답으로 이루어진 네트워크이다. 그 네트워크는 어떤 목적이 있다. 1장의 예처럼 "커피 주문"의 협력이 있다고 한다면 손님, 캐시어, 바리스타 객체들 간에 커피를 위해 서로 수많은 요청과 응답이 필요하다. 

책임

책임은 어떤 객체가 다른 객체에게 받은 요청 메시지를 수신하고, 이에 대해 응답하고 처리해야 하는 것을 말한다. 손님이 캐시어에게 '커피 한 잔 주세요'라고 요청한다면, 캐시어는 손님의 요청에 대한 응답을 해야 할 책임을 갖느다. 협력을 위해 객체가 다른 객체에게 요청을 보내고, 수신한 객체에게 책임을 수행하게 만드는 것을 메시지 전송이라고 한다.

객체지향의 설계는 클래스, 상속의 관계를 먼저 생각하는 것이 아닌 협력(해야할 일)에 참여하기 위해 어떤 객체가 어떤 책임을 수행해야 하고, 어떤 객체로부터 메시지를 수신할 것인지가 먼저이다.

역할

역할은 책임의 집합을 의미한다. 반복되는 협력과정 (e.g. 아메리카노 주문, 카페라떼 주문, 케이크 주문...)을 추상화하여 협력을 유연하게 만든다. 이를 다양항 객체들이 동일한 협력에 참여할 수 있게 만든다. 역할을 통해 객체지향 설계의 단순성(simplicity), 유연성(flexibility), 재사용성(reusability)을 높인다. 자바의 구현 사항 예로는 추상화한 interface, abstract으로 볼 수 있다.

객체지향에 대한 두 가지 오류

  1. 객체는 데이터를 저장하기 위해 존재한다
  2. → 객체는 협력에 참여하기 위해서이다. 실제로 중요한 것은 객체의 행동, 책임이다.
  3. 클래스와 클래스 간의 관계가 중요하다
  4. → 클래스는 시스템에 필요한 객체를 표현, 생성하기 위한 수단일 뿐이다. 클래스를 어떻게 구현하는지 중요한게아니라 객체가 협력 안에서 어떤 책임과 역할을 수행할 것인지가 중요하다.

올바른 객체 지향 설계 방법

  1. 협력을 설계한다. 객체들 간 주고 받을 요청과 응답의 흐름을 결정한다.
  2. 협력에 참여하기 위해 객체의 책임을 설계한다.
  3. 책임 설계 후 필요한 데이터를 설계한다.
  4. 언어에 맞는 클래스 구현 방법 결정한다.

객체지향 설계 기법

객체 지향 설계에 가장 중요한 것은 협력, 책임, 역할이다. 협력, 책임, 역할을 중심으로하는 설계 기법 3가지를 소개한다.

1. 책임-주도 설계(Responsibility - Driven Design)

  • 협력에 필요한 책임들 식별한다.
  • 객체에게 책임을 할당한다.

객체지향 개발에서 가장 중요한 능력은 책임을 능숙하게 소프트웨어 객체에 할당하는 것 - 크레이그 라만(Craig Larman)

2. 디자인 패턴 (Design Pattern)

  • 고수들의 경험으로 이미 만들어진 설계 패턴 (책임-주도 설계 기반)
  • 반복적으로 발생하는 문제 → 그에 맞는 해법
  • 현재 내가 주어진 상황을 명확하게 파악하고, 그에 맞는 패턴(해법)이 있다면 디자인 패턴을 사용한다.
  • 처음부터 직접 책임-주도 설계할 필요 없이 디자인 패턴을 사용해 빠르고 손쉽게 역할, 책임, 협력을 파악할 수 있다.

3. 테스트-주도 개발 (Test-Driven Development)

  • 테스트 주도 개발 기본 흐름 3가지
    1. 실패하는 테스트를 작성한다.
    2. 테스트를 통과하는 가장 간단한 코드를 작성한다. (코드가 지저분해도 상관없음)
    3. 리팩터링을 통해 중복을 제거한다.
  • 위 과정을 반복하여 '작동하는 깔끔한 코드(clean code that works)'를 얻을 수 있다. TDD는 단순히 개발을 위한 테스트가 아니라 설계를 위한 기법이다.

출처 : https://marsner.com/blog/why-test-driven-development-tdd/

  • 객체지향 프로그래밍에 TDD를 적용하려면 테스트를 먼저 작성하기보다 책임-주도 설계를 먼저 알아야 한다.

댓글