工厂构造函数中的参数验证?

时间:2018-04-10 16:23:25

标签: validation oop design-patterns constructor factory-pattern

美好的一天。我希望你能帮助我。

让我们说,我有一个。它的构造函数有一些参数。在构造函数内部,验证在实例化时作为参数传递的一个或多个值。如果其中一个无效,则抛出异常。

我还有一个 factory 类,工厂方法应该创建上述类型的对象。工厂构造函数具有上面类中定义的一些参数。创建对象所需的其他参数在工厂方法中定义。

我想问一下:传递给工厂构造函数的参数是否也应该以类似于类构造函数的方式进行验证?

感谢您的时间和耐心。随意问我什么。

我还准备了一个例子(在PHP中)。关于它,是否应该在on_msg中定义validateColor方法,尽管HatFactory类中已经发生了相同的验证?

test.php的

Hat

测试/帽子

<?php

use Tests\HatFactory;

$hatFactory = new HatFactory('yellow');

$hat1 = $hatFactory->createHat('AdiDix');

$hat2 = $hatFactory->createHat('NiKy');

echo '<pre>' . print_r($hat1, TRUE) . '</pre>';

echo '<pre>' . print_r($hat2, TRUE) . '</pre>';

测试/ HatFactory.php

<?php

namespace Tests;

class Hat {

    /**
     * Hat brand.
     *
     * @var string
     */
    private $brand;

    /**
     * Hat color.
     *
     * @var string
     */
    private $color;

    /**
     * @param string $brand Hat brand.
     * @param string $color Hat color.
     */
    public function __construct(string $brand, string $color) {
        $this->validateColor($color);

        $this->brand = $brand;
        $this->color = $color;
    }

    /**
     * Validate the hat color.
     *
     * @param string $color Hat color.
     * @throws Exception Color not allowed.
     */
    private function validateColor(string $color) {
        if ($color !== 'red' && $color !== 'blue') {
            throw new Exception('The selected color is not allowed!');
        }
    }

}

1 个答案:

答案 0 :(得分:2)

在我看来,考虑到工厂的实现 - 颜色也是构造函数的参数 - 你也应该添加验证,因为颜色是工厂本身的属性,工厂不应该这样做。 t存在于无效状态......

认为,现在,$color属性仅用于创建createHat对象的Hat方法,但没有什么可以阻止未来该属性也可能用于其他东西...也许你添加一个createTopHat方法,创建一个在构造函数中没有验证的TopHat ...或者你想要的添加getColor方法,以按颜色组织工厂......或任何你能想象到的东西!

如果颜色是createHat方法本身的参数,那么您应该避免重复验证,但只要工厂需要存在有效颜色,就应该验证它......

也就是说,假设HatHatFactory的颜色验证始终相同(现在似乎是 ,但不是需要!),你可以把它移到某个ColorValidator课程以保持干燥 - 这是一个好主意imo