트랙
/
Ruby
Ruby
/
연습 문제
/
Gilded Rose
Gilded Rose

Gilded Rose

어려움

지침

Gilded Rose의 엔지니어링 팀에 오신 것을 환영해요! 아시다시피 우리는 최고급 상품만 사고파는 여관이에요. 우리 상품은 유통기한이 다가올수록 품질이 계속 떨어져서, 이런 데이터를 관리하는 재고 시스템을 운영하고 있어요.

새로운 카테고리의 상품을 판매하려면 시스템에 새 기능을 추가해야 해요. 그런데 코드가 엉망이라, 기존 코드를 먼저 리팩터링하지 않으면 새 기능을 추가하기 어려울 거예요.

그래서 할 일은 두 가지예요. 재고 시스템을 리팩터링하고, 새 기능을 추가하는 거예요.

재고 시스템 개요

우리 시스템의 기본은 이래요:

  • 모든 상품에는 "sell in" 속성이 있어요. 이 속성은 상품을 팔아야 하는 남은 일수를 나타내요.
  • 모든 상품에는 "quality" 속성이 있어요. 이 속성은 상품이 얼마나 가치 있는지를 나타내요.
  • 하루가 끝날 때마다 시스템은 모든 상품의 두 값을 낮춰요.

꽤 간단하죠? 그런데 여기서부터가 흥미로워요:

  • 유통기한이 지나면 품질은 두 배로 빠르게 떨어져요.
  • 상품의 품질은 절대 음수가 되지 않아요.
  • **Aged Brie**는 오래될수록 품질이 오히려 올라가요.
  • 상품의 품질은 50을 넘지 않아요.
  • **Sulfuras**의 경우 전설적인 상품이라 유통기한이 없고, 품질은 80으로 절대 떨어지지 않아요.
  • **Backstage passes**는 **Aged Brie**처럼 유통기한이 다가올수록 품질이 올라가요. 10일 이하로 남으면 품질이 2씩, 5일 이하로 남으면 3씩 올라가지만, 공연이 끝나면 품질이 0으로 떨어져요.

1. 리팩터링

새 기능을 위한 길을 닦기 위해, 기존 코드를 리팩터링해서 변경하기 쉽게 만들어 봐요.

모든 것이 여전히 제대로 동작한다면, 즉 기존 기능에 대한 테스트가 여전히 통과한다면 무엇이든 바꾸고 새 코드를 추가해도 괜찮아요.

참고: 상품은 항상 유효한 품질로 _시작한다_고 가정해도 돼요. 다시 말해, 자동 테스트는 상품의 초기 품질이 최댓값을 넘는 경우나 **Sulfuras**의 초기 품질이 80이 아닌 경우에 무슨 일이 일어나는지는 확인하지 않아요.

2. 새 기능 추가하기

최근에 Conjured 상품을 공급하는 업체와 계약했어요. 이제 시스템에 다음 규칙을 추가할 차례예요:

  • Conjured 상품은 유통기한이 지나면 품질이 0으로 떨어져요. 그리고:
    • **Conjured normal items**는 conjured가 아닌 일반 상품보다 품질이 두 배로 빠르게 떨어져요.
    • conjured가 아닌 Sulfuras와 달리 **Conjured Sulfuras**에는 유통기한이 있어요.
    • **Conjured backstage passes**는 conjured가 아닌 backstage passes보다 품질이 1 적게 올라가요.
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Ruby Exercism

Gilded Rose 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Ruby 트랙을 개념 21개연습 문제 121개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.