prodigeris/php-gilded-rose-refactoring-kata

我的PHP解决方案——GildedRose重构Kata。

v1.1 2019-02-04 21:55 UTC

This package is auto-updated.

Last update: 2024-09-05 19:32:30 UTC


README

需求

php: 7.1或以上

安装

composer require prodigeris/php-gilded-rose-refactoring-kata

使用方法

如果你不使用容器

<?php

$sulfuras = new \GildedRose\Item('Sulfuras, Hand of Ragnaros', 80, 2);
$regularItem = new \GildedRose\Item('AK-47, Hand of Ragnaros', 10, 2);
$backstagePass = new \GildedRose\Item('Backstage passes to a TAFKAL80ETC concert', 10, 2);

$items = compact('sulfuras', 'regularItem', 'backstagePass');

$productFactoryRegistry = new \GildedRose\ProductFactoryRegistry();

$productFactoryRegistry->register(\GildedRose\Products\RegularProduct::class);
$productFactoryRegistry->register(\GildedRose\Products\Sulfuras::class);
$productFactoryRegistry->register(\GildedRose\Products\BackstagePass::class);

$productFactory = new \GildedRose\ProductFactory($productFactoryRegistry);

$gildedRose = new \GildedRose\GildedRose($items, $productFactory);
$gildedRose->updateQuality();

测试

只需运行phpunit以执行所有测试。

描述

这是我针对Gilded Rose重构Kata的PHP解决方案,由Terry Hughes编写。

这很有趣;我成功使用了几个设计模式。

  • 抽象工厂模式用于构建ProductsItems的实现)
  • 装饰者模式用于修改ProductsItem值。
  • 命令模式用于根据规则修改Item值。

产品

关于Product的所有内容都可以动态设置。

  • 特质
    • HasDayRangeMultiplier。如果产品的质量随时间变化而不同。默认使用。
    • Expires。如果产品的质量在销售日期后变为零(例如BackstagePass)。
  • 属性
    • const name。由ProductFactory识别产品的名称。默认值:empty
    • max_quality。确定质量的最大值。默认值:50
    • min_quality。确定质量的最小值。默认值:0
    • quality_step。确定质量随时间变化的方向和速度。默认值:-1
    • day_range_multiplier。确定质量如何根据天数起作用。默认值:[0 => 2],这意味着在销售日期之后,质量步长是两倍。
  • 公共方法
    • update。为新产品更新Item
    • getItem。返回分配给产品的Item
    • getMaxQuality
    • getMinQuality
    • getQualityStep。返回考虑了乘数后的质量步长。
    • getNewQuality。返回下一天的质量。警告:它不考虑规则。规则在属性更改时进行检查。
    • isAfterSale。返回产品是否已过销售日期

新产品

如果您想引入新产品,请首先在Products目录中创建一个类。

例如。

<?php

namespace GildedRose\Products;

use GildedRose\Product;

/**
 * Class Conjured
 *
 * @package \GildedRose\Products
 */
class Conjured extends Product
{
    /**
     * The name of the product
     */
    const NAME = 'Conjured Mana Cake';

    /**
     * Quality increases by 2 over time
     *
     * @var int
     */
    protected static $quality_step = -2;
}

然后在ProductFactoryRegistry的容器中注册。

$productFactoryRegistry->register(Conjured::class);

好了!