美好的一天。我希望你能帮助我。
让我们说,我有一个类。它的构造函数有一些参数。在构造函数内部,验证在实例化时作为参数传递的一个或多个值。如果其中一个无效,则抛出异常。
我还有一个 factory 类,工厂方法应该创建上述类型的对象。工厂构造函数具有上面类中定义的一些参数。创建对象所需的其他参数在工厂方法中定义。
我想问一下:传递给工厂构造函数的参数是否也应该以类似于类构造函数的方式进行验证?
感谢您的时间和耐心。随意问我什么。
我还准备了一个例子(在PHP中)。关于它,是否应该在on_msg
中定义validateColor
方法,尽管HatFactory
类中已经发生了相同的验证?
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>';
<?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!');
}
}
}
答案 0 :(得分:2)
在我看来,考虑到工厂的实现 - 颜色也是构造函数的参数 - 你也应该添加验证,因为颜色是工厂本身的属性,工厂不应该这样做。 t存在于无效状态......
认为,现在,$color
属性仅用于创建createHat
对象的Hat
方法,但没有什么可以阻止未来该属性也可能用于其他东西...也许你添加一个createTopHat
方法,创建一个在构造函数中没有验证的TopHat
...或者你想要的添加getColor
方法,以按颜色组织工厂......或任何你能想象到的东西!
如果颜色是createHat
方法本身的参数,那么您应该避免重复验证,但只要工厂需要存在有效颜色,就应该验证它......
也就是说,假设Hat
和HatFactory
的颜色验证始终相同(现在似乎是 ,但不是需要!),你可以把它移到某个ColorValidator
课程以保持干燥 - 这是一个好主意imo