學習軌道
/
Ruby
Ruby
/
練習
/
鍍金玫瑰
鍍金玫瑰

鍍金玫瑰

困難

說明

歡迎加入 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**的一般商品,品質劣化速度是非 Conjured 的一般商品的兩倍。
    • **Conjured**的 Sulfuras 和未受魔法影響的 Sulfuras 不同,具有保存期限。
    • **Conjured**的 backstage passes,品質增加量比它們未受魔法影響時少 1。
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Ruby Exercism

準備好開始 鍍金玫瑰 了嗎?

註冊 Exercism,透過 21 個概念121 個練習 和真人引導來學習並精通 Ruby,全部免費。