lang/tdd

OOP 객체 액션

C/H 2010. 12. 14. 08:30
요구사항
목적
비디오 가게에서 고객이 대여하는 비디오의 대여정보를 조회할 수 있는 프로그램을 작성한다.

요구사항
  1. 고객은 이름을 갖는다.
  2. 고객은 한번에 여러 개의 비디오를 대여할 수 있으나 각각의 대여기간은 다를 수 있다.
  3. 비디오는 영화, 스포츠, 다큐먼터리의 세 종류가 있다.
  4. 각 비디오는 독립적인 일일 대여요금을 갖는다.
  5. 영화는 대여기간이 2일 이상되면 3일째부터는 대여요금이 1/2로 할인된다.
  6. 다큐먼터리는 3일 이상 대여하면 4일째부터 1/3로 할인된다.
  7. 스포츠는 장기대여 할인이 없다.
  8. 비디오 1개 대여할 때마다 보너스 포인트는 1포인트씩 올라간다. 단, 스포츠는 2포인트씩 올라간다.
  9. 과거의 대여기록을 보유하고 있을 필요는 없으나 고객이 얻은 총 보너스 포인트 정보는 알고 있어야 한다.
  10. 고객의 현재 대여정보를 구할 수 있는 기능을 작성하라.
    총 대여비디오 수
    대여정보: 비디오(종류 + 제목 + 가격), 대여기간 리스트
    총 대여가격
    현재 대여하고 있는 비디오로 인해 추가된 포인트

요구사항 정련
  • 고객은 한 번에 여러 개의 비디오를 대여할 수 있으나 각 대여기간은 다를 수 있다.
    * 업무 규칙 *
    - 고객은 한 번에 여러 개의 비디로를 대여 할수 있다.
    - 대여기간은 비디오 마다 각각 다를 수 있다.
  • 비디오는 영화, 스포츠, 다큐먼터리의 세 종류가 있다.
    * 업무 규칙 *
    - 비디오에는 종류가 있다.
    - 현재 비디오의 종류는 영화, 스포츠, 다큐먼터리의 세 종류다.
  • 영화는 대여기간이 2일 이상 되면 3일째부터는 대여요금이 1/2로 할인된다.
    * 업무 규칙 *
    - 영화는 대여기간이 n일 이상되면 m일째부터 대여요금이 p로 할인된다.

요구사항 정련 결과
* 업무규칙 *
  1. 고객은 이름을 갖는다.
  2. 고객은 한 번에 여러 개의 비디오를 대여할 수 있다.
  3. 대여기간은 비디오마다 각각 다를 수 있따.
  4. 비디오에는 종류가 있다.
  5. 현재 비디오의 종류는 영화, 스포츠, 다큐먼터리의 세 종류다.
  6. 각 비디오는 독립적인 일일  대여요금을 갖는다.
  7. 영화는 대여기간이 2일 이상 되면 3일째부터는 대여요금이 1/2로 할인된다.
    예: 영화는 대여기간이 n일 이상이 되면 m일째부터 대여요금이 p로 할이된다.
  8. 다큐먼터리는 3일 이상 대여하면 4일째부터는 1/3로 할인된다.
    예: 어떤 비디오의 타입은 n일 이상 대여하면 m일째부터 p로 할인된다.
  9. 스포츠는 장기대여 할인이 없다.
    예: 어떤 비디오 타임은 장기대여 할인이 없다.
  10. 비디오 1개 대여할 때마다 보너스 포인트 1포인트씩 누적된다. (단, 스포츠는 2포인트씩)>
    예: 고객의 보너스 포인트 누적점수는 비디오를 n개 대여할 때마다 보너스 포인트 m포인트씩 누적된다.(단, 특정 타입은 p포인트씩).
  11. 시스템은 고객의 과거의 대여기록을 보유하고 있을 필요 없다.

* 고객과 협의해 확정해야 하는 업무규칙 *

  • 대여는 일 단위다.
  • 포인트는 정수다.
  • 할인은 분수 비율이다.

* 기능 요구사항 *

  1. 고객은 비디오를 여야할 수 있다.
  2. 시스템은 고객의 현재 대여정보를 제공할 수 있다.
    대여정보
    - 총 비디오 대여수
    - 비디오(종류 + 제목 + 가격), 대여기간 리스트
    - 총 대여가격
    - 현재 대여하고 있는 비디오로 인해 추가된 포인트
  3. 시스템은 현 대여로 인해 발생하는 포인트 총합을 계산할 수 있다.
  4. 시스템은 대여된 비디오들의 총 대여가격을 계산할 수 있다.
  5. 시스템은 총 대여비디오 수를 계산할 수 있다.

* 기타 요구사항 확인 작업 *
  • 과거의 대여기록을 보유하고 있을 필요는 없으나 고객이 얻은 총 보너스 포인트 정보는 알고 있어야 한다. ▶ 포인트 정보의 기록을 의미하는 건지, 개별 포인트만의 관리가 아닌 대여 반납의 포인트 합산인지를 확인한다.



행위 기반 클래스 도출
대여한다 (고객이 비디오를)
할인된다 (비디오 일일 대여각격이)
누적된다 (보너스 포인트가)
계산한다 (시스템이 포인트 총합을)
계산한다 (시스템이 총 대여가격을)
계산한다 (시스템이 총 대여비디오 수를)
제공한다 (시스템이 대여 정보를)

OOP에서 객체에 수동 액션을 담는 일은 좀처럼 없다. (버스가 운전을 당한다? 설마~). 그런데 요구사항으로부터 액션(행동)을 도출하고 보면 본의 아니게 수동이 쓰이는 경우가 있다. 만ㅇ리 수동이 쓰인 상태로 구현을 하게 되면 타 모듈에 대한 의존성이 높아져서 설계가 전체적으로 복잡해 진다. 다음 예를 보자
할인된다 (비디오 일일 대여가격이)
누적된다 (보너스 포인트가)

위 두 가지 액션을 하는 행위를 능동형으로 바꿔보자. 바꾸다 보면, 행위의 주체가 시스템이라는 걸 자연스럽게 알 수 있다.
할인한다 (시스템이 비디오 일일 대여가격을)
누적한다 (시스템이 포인트를)


소유기반 클래스 도출
이름을 갖는다 (각 고객은)
종류를 갖는다 (각 비디오는)
대여요금을 갖는다 (각 비디오는)
포인트를 갖는다 ( 각 비디오)
대여일수를 갖는다 (비디오가? 고객이?)

고객에서 비디오 타입까지
 - 행위 기반 클래스
대여한다 (고객이 비디오를)
할인한다 (시스템이 비디오 일일 대여가격을)
누적한다 (시스템이 포인트를)
계산한다 (시스템이 포인트 총합을)
계산한다 (시스템이 총 대여가격을)
계산한다 (시스템이 총 대여비디오 수를)|
제공한다 (시스템이 대여정보를)

비디오샵과 고객의 관계
- 소유기반 클래스(엔티티 클래스)
이름을 갖는다 (각 고객은)
종류를 갖는다 (각 비디오는)
대여요금을 갖는다 (각 비디오는)
포인트를 갖는다 (각 비디오 타입은)
대여일수를 갖는다 (각 대여는)
반응형

'lang > tdd' 카테고리의 다른 글

TDD 우분투에서 phpunit 설치  (0) 2010.12.08
TDD jUnit4 비교표현확장: Hamcrest  (0) 2010.12.07
TDD jUnit4 특징  (0) 2010.12.06
TDD 실습 - 은행계좌(Account) 클래스 만들기  (0) 2010.12.03
TDD 개발 진행방식  (0) 2010.12.02