From 9cc121e80c932256edb90990bab89e525683cc4a Mon Sep 17 00:00:00 2001 From: kitfbgh Date: Sat, 2 Apr 2022 12:50:58 +0800 Subject: [PATCH] Refactor - Add different item classes - Separate logic of updateQuality - Modify tests --- php/src/GildedRose.php | 34 +---------------------------- php/src/Item.php | 9 ++++---- php/src/Item/AgedBrieItem.php | 19 ++++++++++++++++ php/src/Item/BackstagePassItem.php | 26 ++++++++++++++++++++++ php/src/Item/NormalItem.php | 19 ++++++++++++++++ php/src/Item/SulfurasItem.php | 12 ++++++++++ php/tests/GildedRoseTest.php | 35 ++++++++++++++++-------------- 7 files changed, 101 insertions(+), 53 deletions(-) create mode 100644 php/src/Item/AgedBrieItem.php create mode 100644 php/src/Item/BackstagePassItem.php create mode 100644 php/src/Item/NormalItem.php create mode 100644 php/src/Item/SulfurasItem.php diff --git a/php/src/GildedRose.php b/php/src/GildedRose.php index c0318e15..99ea3000 100644 --- a/php/src/GildedRose.php +++ b/php/src/GildedRose.php @@ -24,39 +24,7 @@ final class GildedRose public function updateQuality(): void { foreach ($this->items as $item) { - if ($item->name === 'Sulfuras, Hand of Ragnaros') { - continue; - } - - if ($item->name === 'Aged Brie' || $item->name === 'Backstage passes to a TAFKAL80ETC concert') { - if ($item->quality < 50) { - $item->quality = $item->quality + 1; - if ($item->name === 'Backstage passes to a TAFKAL80ETC concert') { - if ($item->sellIn < 11) { - $item->increaseQuality(); - } - if ($item->sellIn < 6) { - $item->increaseQuality(); - } - } - } - } else { - $item->decreaseQuality(); - } - - $item->sellIn = $item->sellIn - 1; - - if ($item->sellIn < 0) { - if ($item->name === 'Aged Brie') { - $item->increaseQuality(); - } else { - if ($item->name === 'Backstage passes to a TAFKAL80ETC concert') { - $item->quality = $item->quality - $item->quality; - } else { - $item->decreaseQuality(); - } - } - } + $item->update(); } } } diff --git a/php/src/Item.php b/php/src/Item.php index 1121751c..a4ac8f0a 100644 --- a/php/src/Item.php +++ b/php/src/Item.php @@ -3,8 +3,7 @@ declare(strict_types=1); namespace GildedRose; - -final class Item +abstract class Item { public string $name; @@ -24,7 +23,9 @@ final class Item return "{$this->name}, {$this->sellIn}, {$this->quality}"; } - public function increaseQuality(): void + abstract public function update(); + + protected function increaseQuality(): void { if ($this->quality >= 50) { return; @@ -32,7 +33,7 @@ final class Item $this->quality += 1; } - public function decreaseQuality(): void + protected function decreaseQuality(): void { if ($this->quality <= 0) { return; diff --git a/php/src/Item/AgedBrieItem.php b/php/src/Item/AgedBrieItem.php new file mode 100644 index 00000000..d60986c9 --- /dev/null +++ b/php/src/Item/AgedBrieItem.php @@ -0,0 +1,19 @@ +increaseQuality(); + $this->sellIn -= 1; + if ($this->sellIn < 0) { + $this->increaseQuality(); + } + } +} \ No newline at end of file diff --git a/php/src/Item/BackstagePassItem.php b/php/src/Item/BackstagePassItem.php new file mode 100644 index 00000000..db585363 --- /dev/null +++ b/php/src/Item/BackstagePassItem.php @@ -0,0 +1,26 @@ +sellIn -= 1; + $this->increaseQuality(); + if ($this->sellIn < 10) { + $this->increaseQuality(); + } + if ($this->sellIn < 5) { + $this->increaseQuality(); + } + if ($this->sellIn < 0) { + $this->quality = 0; + } + + } +} \ No newline at end of file diff --git a/php/src/Item/NormalItem.php b/php/src/Item/NormalItem.php new file mode 100644 index 00000000..d760bc19 --- /dev/null +++ b/php/src/Item/NormalItem.php @@ -0,0 +1,19 @@ +decreaseQuality(); + $this->sellIn = $this->sellIn - 1; + if ($this->sellIn < 0) { + $this->decreaseQuality(); + } + } +} \ No newline at end of file diff --git a/php/src/Item/SulfurasItem.php b/php/src/Item/SulfurasItem.php new file mode 100644 index 00000000..1b7c4785 --- /dev/null +++ b/php/src/Item/SulfurasItem.php @@ -0,0 +1,12 @@ +updateQuality(); @@ -22,7 +25,7 @@ class GildedRoseTest extends TestCase public function testSulfurasCouldNotBeSold(): void { - $items = [new Item("Sulfuras, Hand of Ragnaros", 10, 0)]; + $items = [new SulfurasItem("Sulfuras, Hand of Ragnaros", 10, 0)]; $app = new GildedRose($items); $app->updateQuality(); @@ -32,7 +35,7 @@ class GildedRoseTest extends TestCase public function testSulfurasCouldNotDecreaseQuality(): void { - $items = [new Item("Sulfuras, Hand of Ragnaros", 10, 10)]; + $items = [new SulfurasItem("Sulfuras, Hand of Ragnaros", 10, 10)]; $app = new GildedRose($items); $app->updateQuality(); @@ -42,7 +45,7 @@ class GildedRoseTest extends TestCase public function testQualityCouldNotBeMoreThanFifty(): void { - $items = [new Item("Aged Brie", 10, 50)]; + $items = [new AgedBrieItem("Aged Brie", 10, 50)]; $app = new GildedRose($items); $app->updateQuality(); @@ -52,7 +55,7 @@ class GildedRoseTest extends TestCase public function testItemWithDatePassedQualityDecreaseByTwice(): void { - $items = [new Item("foo", -1, 40)]; + $items = [new NormalItem("foo", -1, 40)]; $app = new GildedRose($items); $app->updateQuality(); @@ -62,7 +65,7 @@ class GildedRoseTest extends TestCase public function testAgedBrieIncreaseQualityWhenItGetsOlder(): void { - $items = [new Item("Aged Brie", 1, 40)]; + $items = [new AgedBrieItem("Aged Brie", 1, 40)]; $app = new GildedRose($items); $app->updateQuality(); @@ -72,7 +75,7 @@ class GildedRoseTest extends TestCase public function testAgedBrieIncreaseByTwoQualityWhenDatePassed(): void { - $items = [new Item("Aged Brie", -1, 40)]; + $items = [new AgedBrieItem("Aged Brie", -1, 40)]; $app = new GildedRose($items); $app->updateQuality(); @@ -81,7 +84,7 @@ class GildedRoseTest extends TestCase } public function testAgedBrieIncreaseByTwoQualityWhenDatePassedAndNotMoreThanFifty() { - $items = [new Item("Aged Brie", -1, 50)]; + $items = [new AgedBrieItem("Aged Brie", -1, 50)]; $app = new GildedRose($items); $app->updateQuality(); @@ -90,7 +93,7 @@ class GildedRoseTest extends TestCase } public function testBackstagePassesIncreaseQualityByTwoWhenSelinLessThanTen() { - $items = [new Item("Backstage passes to a TAFKAL80ETC concert", 10, 40)]; + $items = [new BackstagePassItem("Backstage passes to a TAFKAL80ETC concert", 10, 40)]; $app = new GildedRose($items); $app->updateQuality(); @@ -99,7 +102,7 @@ class GildedRoseTest extends TestCase } public function testBackstagePassesIncreaseQualityByTwoWhenSellinLessThanSix() { - $items = [new Item("Backstage passes to a TAFKAL80ETC concert", 6, 40)]; + $items = [new BackstagePassItem("Backstage passes to a TAFKAL80ETC concert", 6, 40)]; $app = new GildedRose($items); $app->updateQuality(); @@ -108,7 +111,7 @@ class GildedRoseTest extends TestCase } public function testBackstagePassesIncreaseQualityByThreeWhenSellinLessThanFive() { - $items = [new Item("Backstage passes to a TAFKAL80ETC concert", 5, 40)]; + $items = [new BackstagePassItem("Backstage passes to a TAFKAL80ETC concert", 5, 40)]; $app = new GildedRose($items); $app->updateQuality(); @@ -117,7 +120,7 @@ class GildedRoseTest extends TestCase } public function testBackstagePassesIncreaseQualityByTwoWhenSellinLessThanSixAndNotMoreThanFifty() { - $items = [new Item("Backstage passes to a TAFKAL80ETC concert", 6, 49)]; + $items = [new BackstagePassItem("Backstage passes to a TAFKAL80ETC concert", 6, 49)]; $app = new GildedRose($items); $app->updateQuality(); @@ -126,7 +129,7 @@ class GildedRoseTest extends TestCase } public function testBackstagePassesIncreaseQualityByThreeWhenSellinLessThanFiveAndNotMoreThanFifty() { - $items = [new Item("Backstage passes to a TAFKAL80ETC concert", 5, 48)]; + $items = [new BackstagePassItem("Backstage passes to a TAFKAL80ETC concert", 5, 48)]; $app = new GildedRose($items); $app->updateQuality(); @@ -135,7 +138,7 @@ class GildedRoseTest extends TestCase } public function testBackstagePassesQualityDropsToZeroAfterConcert() { - $items = [new Item("Backstage passes to a TAFKAL80ETC concert", 0, 40)]; + $items = [new BackstagePassItem("Backstage passes to a TAFKAL80ETC concert", 0, 40)]; $app = new GildedRose($items); $app->updateQuality(); @@ -144,7 +147,7 @@ class GildedRoseTest extends TestCase } public function testBackstagePassesQualityIncreaseQualityByOneWhenDateIsMoreThanTen() { - $items = [new Item("Backstage passes to a TAFKAL80ETC concert", 11, 40)]; + $items = [new BackstagePassItem("Backstage passes to a TAFKAL80ETC concert", 11, 40)]; $app = new GildedRose($items); $app->updateQuality();