To prepare to move business logic out of god object antipattern, provide domain objects and factory pattern

This commit is contained in:
Sam Burns 2024-01-24 15:14:06 +00:00
parent 46f45e2661
commit 9fdc9ab29f
9 changed files with 172 additions and 18 deletions

View File

@ -0,0 +1,10 @@
<?php
declare(strict_types=1);
namespace GildedRose;
interface GildedRoseItem
{
public function ageByOneDay(): void;
}

View File

@ -0,0 +1,19 @@
<?php
declare(strict_types=1);
namespace GildedRose\GildedRoseItem;
use GildedRose\GildedRoseItem;
use GildedRose\Item;
class BackstagePassItem implements GildedRoseItem
{
public const NAME = 'Backstage passes to a TAFKAL80ETC concert';
public function __construct(private Item $item) {}
public function ageByOneDay(): void
{
}
}

View File

@ -0,0 +1,19 @@
<?php
declare(strict_types=1);
namespace GildedRose\GildedRoseItem;
use GildedRose\GildedRoseItem;
use GildedRose\Item;
class BrieItem implements GildedRoseItem
{
public const NAME = 'Aged Brie';
public function __construct(private Item $item) {}
public function ageByOneDay(): void
{
}
}

View File

@ -0,0 +1,17 @@
<?php
declare(strict_types=1);
namespace GildedRose\GildedRoseItem;
use GildedRose\GildedRoseItem;
use GildedRose\Item;
class DefaultItem implements GildedRoseItem
{
public function __construct(private Item $item) {}
public function ageByOneDay(): void
{
}
}

View File

@ -0,0 +1,19 @@
<?php
declare(strict_types=1);
namespace GildedRose\GildedRoseItem;
use GildedRose\GildedRoseItem;
use GildedRose\Item;
class SulfurasItem implements GildedRoseItem
{
public const NAME = 'Sulfuras, Hand of Ragnaros';
public function __construct(private Item $item) {}
public function ageByOneDay(): void
{
}
}

View File

@ -0,0 +1,27 @@
<?php
declare(strict_types=1);
namespace GildedRose;
use GildedRose\GildedRoseItem\BrieItem;
use GildedRose\GildedRoseItem\BackstagePassItem;
use GildedRose\GildedRoseItem\SulfurasItem;
use GildedRose\GildedRoseItem\DefaultItem;
class GildedRoseItemFactory
{
public function createGildedRoseItem(Item $item): GildedRoseItem
{
switch ($item->name) {
case BrieItem::NAME:
return new BrieItem($item);
case BackstagePassItem::NAME:
return new BackstagePassItem($item);
case SulfurasItem::NAME:
return new SulfurasItem($item);
default:
return new DefaultItem($item);
}
}
}

View File

@ -1,18 +0,0 @@
<?php
declare(strict_types=1);
namespace PhpUnitTests;
use ApprovalTests\Approvals;
use GildedRose\GildedRose;
use GildedRose\Item;
use PHPUnit\Framework\TestCase;
class ExamplelTest extends TestCase
{
public function testFoo(): void
{
$this->assertTrue(true);
}
}

View File

@ -0,0 +1,61 @@
<?php
declare(strict_types=1);
namespace PhpUnitTests;
use ApprovalTests\Approvals;
use GildedRose\GildedRoseItem;
use GildedRose\GildedRoseItem\BrieItem;
use GildedRose\GildedRoseItem\BackstagePassItem;
use GildedRose\GildedRoseItem\DefaultItem;
use GildedRose\GildedRoseItem\SulfurasItem;
use GildedRose\GildedRoseItemFactory;
use GildedRose\Item;
use PHPUnit\Framework\TestCase;
class GildedRoseItemFactoryTest extends TestCase
{
private GildedRoseItemFactory $factory;
protected function setUp(): void
{
$this->factory = new GildedRoseItemFactory();
}
public function testCreatingDefaultItem(): void
{
$item = new Item('foo', 0, 0);
$gildedRoseItem = $this->factory->createGildedRoseItem($item);
$this->assertInstanceOf(GildedRoseItem::class, $gildedRoseItem);
$this->assertInstanceOf(DefaultItem::class, $gildedRoseItem);
}
public function testCreatingBrieItem(): void
{
$item = new Item('Aged Brie', 0, 0);
$gildedRoseItem = $this->factory->createGildedRoseItem($item);
$this->assertInstanceOf(GildedRoseItem::class, $gildedRoseItem);
$this->assertInstanceOf(BrieItem::class, $gildedRoseItem);
}
public function testCreatingBackstagePassItem(): void
{
$item = new Item('Backstage passes to a TAFKAL80ETC concert', 0, 0);
$gildedRoseItem = $this->factory->createGildedRoseItem($item);
$this->assertInstanceOf(GildedRoseItem::class, $gildedRoseItem);
$this->assertInstanceOf(BackstagePassItem::class, $gildedRoseItem);
}
public function testCreatingSulfuraItem(): void
{
$item = new Item('Sulfuras, Hand of Ragnaros', 0, 0);
$gildedRoseItem = $this->factory->createGildedRoseItem($item);
$this->assertInstanceOf(GildedRoseItem::class, $gildedRoseItem);
$this->assertInstanceOf(SulfurasItem::class, $gildedRoseItem);
}
}