Refactor Code and write Unit test

This commit is contained in:
Thang Tran 2023-03-01 19:58:51 +07:00
parent b0b603fdc1
commit 9ecfa1d973
9 changed files with 64 additions and 51 deletions

View File

@ -4,13 +4,6 @@ declare(strict_types=1);
namespace GildedRose;
use GildedRose\ItemUpdater\Interface\ItemUpdaterInterface;
use GildedRose\ItemUpdater\AgedBrieItemUpdater;
use GildedRose\ItemUpdater\BackstagePassItemUpdater;
use GildedRose\ItemUpdater\ConjuredItemUpdater;
use GildedRose\ItemUpdater\NormalItemUpdater;
use GildedRose\ItemUpdater\SulfurasItemUpdater;
final class GildedRose
{
/**
@ -27,25 +20,9 @@ final class GildedRose
public function updateQuality(): void
{
foreach ($this->items as $item) {
$itemUpdater = $this->getItemUpdater($item);
$itemUpdater->updateSellIn($item);
$itemUpdater->updateQuality($item);
$itemInstance = ItemFactory::createItem($item);
$itemInstance->updateSellIn($item);
$itemInstance->updateQuality($item);
}
}
/**
* @param Item $item
*
* @return ItemUpdaterInterface
*/
private function getItemUpdater(Item $item): ItemUpdaterInterface
{
return match(true) {
strpos($item->name, 'Aged Brie') !== false => new AgedBrieItemUpdater(),
strpos($item->name, 'Backstage') !== false => new BackstagePassItemUpdater(),
strpos($item->name, 'Sulfuras') !== false => new SulfurasItemUpdater(),
strpos($item->name, 'Conjured') !== false => new ConjuredItemUpdater(),
default => new NormalItemUpdater()
};
}
}

36
php/src/ItemFactory.php Normal file
View File

@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
namespace GildedRose;
use GildedRose\Items\Interface\ItemInterface;
use GildedRose\Items\AgedBrieItem;
use GildedRose\Items\BackstagePassItem;
use GildedRose\Items\ConjuredItem;
use GildedRose\Items\NormalItem;
use GildedRose\Items\SulfurasItem;
class ItemFactory
{
public const AGED_BRIE_ITEM = 'Aged Brie';
public const BACKSTAGE_ITEM = 'Backstage';
public const SULFURAS_ITEM = 'Sulfuras';
public const CONJURED_ITEM = 'Conjured';
/**
* @param Item $item
*
* @return ItemInterface
*/
public static function createItem(Item $item): ItemInterface
{
return match(true) {
strpos($item->name, self::AGED_BRIE_ITEM) !== false => new AgedBrieItem(),
strpos($item->name, self::BACKSTAGE_ITEM) !== false => new BackstagePassItem(),
strpos($item->name, self::SULFURAS_ITEM) !== false => new SulfurasItem(),
strpos($item->name, self::CONJURED_ITEM) !== false => new ConjuredItem(),
default => new NormalItem()
};
}
}

View File

@ -2,12 +2,12 @@
declare(strict_types=1);
namespace GildedRose\ItemUpdater\Abstract;
namespace GildedRose\Items\Abstract;
use GildedRose\Item;
use GildedRose\ItemUpdater\Interface\ItemUpdaterInterface;
use GildedRose\Items\Interface\ItemInterface;
abstract class AbstractItemUpdater implements ItemUpdaterInterface
abstract class AbstractItem implements ItemInterface
{
private const MIN_QUALITY = 0;
private const MAX_QUALITY = 50;

View File

@ -2,13 +2,13 @@
declare(strict_types=1);
namespace GildedRose\ItemUpdater;
namespace GildedRose\Items;
use GildedRose\Item;
use GildedRose\ItemUpdater\Abstract\AbstractItemUpdater;
use GildedRose\ItemUpdater\Interface\ItemUpdaterInterface;
use GildedRose\Items\Abstract\AbstractItem;
use GildedRose\Items\Interface\ItemInterface;
class AgedBrieItemUpdater extends AbstractItemUpdater implements ItemUpdaterInterface
class AgedBrieItem extends AbstractItem implements ItemInterface
{
/**
* @param Item $item

View File

@ -2,13 +2,13 @@
declare(strict_types=1);
namespace GildedRose\ItemUpdater;
namespace GildedRose\Items;
use GildedRose\Item;
use GildedRose\ItemUpdater\Abstract\AbstractItemUpdater;
use GildedRose\ItemUpdater\Interface\ItemUpdaterInterface;
use GildedRose\Items\Abstract\AbstractItem;
use GildedRose\Items\Interface\ItemInterface;
class BackstagePassItemUpdater extends AbstractItemUpdater implements ItemUpdaterInterface
class BackstagePassItem extends AbstractItem implements ItemInterface
{
/**
* @param Item $item

View File

@ -2,13 +2,13 @@
declare(strict_types=1);
namespace GildedRose\ItemUpdater;
namespace GildedRose\Items;
use GildedRose\Item;
use GildedRose\ItemUpdater\Abstract\AbstractItemUpdater;
use GildedRose\ItemUpdater\Interface\ItemUpdaterInterface;
use GildedRose\Items\Abstract\AbstractItem;
use GildedRose\Items\Interface\ItemInterface;
class ConjuredItemUpdater extends AbstractItemUpdater implements ItemUpdaterInterface
class ConjuredItem extends AbstractItem implements ItemInterface
{
/**
* @param Item $item

View File

@ -2,11 +2,11 @@
declare(strict_types=1);
namespace GildedRose\ItemUpdater\Interface;
namespace GildedRose\Items\Interface;
use GildedRose\Item;
interface ItemUpdaterInterface
interface ItemInterface
{
/**
* @param Item $item

View File

@ -2,13 +2,13 @@
declare(strict_types=1);
namespace GildedRose\ItemUpdater;
namespace GildedRose\Items;
use GildedRose\Item;
use GildedRose\ItemUpdater\Abstract\AbstractItemUpdater;
use GildedRose\ItemUpdater\Interface\ItemUpdaterInterface;
use GildedRose\Items\Abstract\AbstractItem;
use GildedRose\Items\Interface\ItemInterface;
class NormalItemUpdater extends AbstractItemUpdater implements ItemUpdaterInterface
class NormalItem extends AbstractItem implements ItemInterface
{
/**
* @param Item $item

View File

@ -2,13 +2,13 @@
declare(strict_types=1);
namespace GildedRose\ItemUpdater;
namespace GildedRose\Items;
use GildedRose\Item;
use GildedRose\ItemUpdater\Abstract\AbstractItemUpdater;
use GildedRose\ItemUpdater\Interface\ItemUpdaterInterface;
use GildedRose\Items\Abstract\AbstractItem;
use GildedRose\Items\Interface\ItemInterface;
class SulfurasItemUpdater extends AbstractItemUpdater implements ItemUpdaterInterface
class SulfurasItem extends AbstractItem implements ItemInterface
{
/**
* @param Item $item