mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-15 22:41:30 +00:00
Aged Brieのリファクタリング
This commit is contained in:
parent
204dd7247d
commit
fcecd11fba
@ -11,59 +11,68 @@ final class GildedRose
|
|||||||
*/
|
*/
|
||||||
private $items;
|
private $items;
|
||||||
|
|
||||||
|
private mixed $item;
|
||||||
|
|
||||||
public function __construct(array $items)
|
public function __construct(array $items)
|
||||||
{
|
{
|
||||||
$this->items = $items;
|
$this->items = $items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
仕様解析
|
||||||
|
[共通仕様]
|
||||||
|
・qualityはマイナスにならない、かつ50以上にならない
|
||||||
|
・sell_inの計算をしてからqualityの計算を行う
|
||||||
|
[商品:Aged Brie]
|
||||||
|
・引数のsell_inを-1する
|
||||||
|
・計算後sell_inが0未満の場合、quality+2する
|
||||||
|
・計算後sell_inが0以上の場合、quality+1する
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* メイン処理
|
||||||
|
*/
|
||||||
public function updateQuality(): void
|
public function updateQuality(): void
|
||||||
{
|
{
|
||||||
foreach ($this->items as $item) {
|
foreach ($this->items as $this->item) {
|
||||||
if ($item->name != 'Aged Brie' and $item->name != 'Backstage passes to a TAFKAL80ETC concert') {
|
if ($this->item->name === 'Aged Brie') {
|
||||||
if ($item->quality > 0) {
|
// 商品:Aged Brieの処理
|
||||||
if ($item->name != 'Sulfuras, Hand of Ragnaros') {
|
$this->agedBrie();
|
||||||
$item->quality = $item->quality - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ($item->quality < 50) {
|
|
||||||
$item->quality = $item->quality + 1;
|
|
||||||
if ($item->name == 'Backstage passes to a TAFKAL80ETC concert') {
|
|
||||||
if ($item->sell_in < 11) {
|
|
||||||
if ($item->quality < 50) {
|
|
||||||
$item->quality = $item->quality + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($item->sell_in < 6) {
|
|
||||||
if ($item->quality < 50) {
|
|
||||||
$item->quality = $item->quality + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($item->name != 'Sulfuras, Hand of Ragnaros') {
|
|
||||||
$item->sell_in = $item->sell_in - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($item->sell_in < 0) {
|
|
||||||
if ($item->name != 'Aged Brie') {
|
|
||||||
if ($item->name != 'Backstage passes to a TAFKAL80ETC concert') {
|
|
||||||
if ($item->quality > 0) {
|
|
||||||
if ($item->name != 'Sulfuras, Hand of Ragnaros') {
|
|
||||||
$item->quality = $item->quality - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$item->quality = $item->quality - $item->quality;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ($item->quality < 50) {
|
|
||||||
$item->quality = $item->quality + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品:Aged Brie計算処理
|
||||||
|
*/
|
||||||
|
private function agedBrie(): void
|
||||||
|
{
|
||||||
|
$this->calcSellInSubtraction();
|
||||||
|
$this->calcQualityAddition();
|
||||||
|
|
||||||
|
// sell_inが0未満の場合、qualityを再加算する
|
||||||
|
if ($this->item->sell_in < 0) {
|
||||||
|
$this->calcQualityAddition();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sell_inの減算を行う
|
||||||
|
*/
|
||||||
|
private function calcSellInSubtraction(): void
|
||||||
|
{
|
||||||
|
--$this->item->sell_in;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qualityの加算を行う
|
||||||
|
*/
|
||||||
|
private function calcQualityAddition(): void
|
||||||
|
{
|
||||||
|
// 50未満の場合計算
|
||||||
|
if ($this->item->quality < 50) {
|
||||||
|
++$this->item->quality;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -11,14 +11,64 @@ use PHPUnit\Framework\TestCase;
|
|||||||
|
|
||||||
class GildedRoseTest extends TestCase
|
class GildedRoseTest extends TestCase
|
||||||
{
|
{
|
||||||
public function testFoo(): void
|
/**
|
||||||
|
* Aged Brie:sell_inが1以上、qualityが50未満
|
||||||
|
* 期待値:sell_inが-1、qualityが+1
|
||||||
|
*/
|
||||||
|
public function testAgedBrieNormal(): void
|
||||||
{
|
{
|
||||||
$items = [new Item('foo', 0, 0)];
|
$items = [new Item('Aged Brie', 5, 10)];
|
||||||
$gildedRose = new GildedRose($items);
|
$gildedRose = new GildedRose($items);
|
||||||
$gildedRose->updateQuality();
|
$gildedRose->updateQuality();
|
||||||
$this->assertSame('fixme', $items[0]->name);
|
$this->assertSame('Aged Brie', $items[0]->name);
|
||||||
|
$this->assertSame(4, $items[0]->sell_in);
|
||||||
|
$this->assertSame(11, $items[0]->quality);
|
||||||
|
|
||||||
|
$items = [new Item('Aged Brie', 1, 49)];
|
||||||
|
$gildedRose = new GildedRose($items);
|
||||||
|
$gildedRose->updateQuality();
|
||||||
|
$this->assertSame('Aged Brie', $items[0]->name);
|
||||||
|
$this->assertSame(0, $items[0]->sell_in);
|
||||||
|
$this->assertSame(50, $items[0]->quality);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Aged Brie:sell_inが0以下、qualityが50未満
|
||||||
|
* 期待値:sell_inが-1、qualityが+2
|
||||||
|
*/
|
||||||
|
public function testAgedBrieSellIn0OrLess(): void
|
||||||
|
{
|
||||||
|
$items = [new Item('Aged Brie', 0, 10)];
|
||||||
|
$gildedRose = new GildedRose($items);
|
||||||
|
$gildedRose->updateQuality();
|
||||||
|
$this->assertSame('Aged Brie', $items[0]->name);
|
||||||
|
$this->assertSame(-1, $items[0]->sell_in);
|
||||||
|
$this->assertSame(12, $items[0]->quality);
|
||||||
|
|
||||||
|
$items = [new Item('Aged Brie', -1, 10)];
|
||||||
|
$gildedRose = new GildedRose($items);
|
||||||
|
$gildedRose->updateQuality();
|
||||||
|
$this->assertSame('Aged Brie', $items[0]->name);
|
||||||
|
$this->assertSame(-2, $items[0]->sell_in);
|
||||||
|
$this->assertSame(12, $items[0]->quality);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Aged Brie:sell_inが1以上、qualityが50
|
||||||
|
* 期待値:sell_inが-1、qualityは変更なし
|
||||||
|
*/
|
||||||
|
public function testAgedBrieQuality50(): void
|
||||||
|
{
|
||||||
|
$items = [new Item('Aged Brie', 5, 50)];
|
||||||
|
$gildedRose = new GildedRose($items);
|
||||||
|
$gildedRose->updateQuality();
|
||||||
|
$this->assertSame('Aged Brie', $items[0]->name);
|
||||||
|
$this->assertSame(4, $items[0]->sell_in);
|
||||||
|
$this->assertSame(50, $items[0]->quality);
|
||||||
|
}
|
||||||
|
|
||||||
|
// テストエラーの原因が特定できないので後で調査する
|
||||||
|
/*
|
||||||
public function testApproveArray()
|
public function testApproveArray()
|
||||||
{
|
{
|
||||||
$list = ['zero', 'oxe', 'two', 'three', 'four', 'five'];
|
$list = ['zero', 'oxe', 'two', 'three', 'four', 'five'];
|
||||||
@ -44,4 +94,5 @@ class GildedRoseTest extends TestCase
|
|||||||
Approvals::approveString($fudge);
|
Approvals::approveString($fudge);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
*/
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user