工厂构造函数中的参数验证?
Arguments validation in factory constructor?
美好的一天。我希望你能帮助我。
比方说,我有一个 class。它的构造函数有一些参数。在构造函数内部,验证在实例化时作为参数传递的一个或多个值。如果其中之一无效,则抛出异常。
我也有一个工厂class,他的工厂方法应该创建一个上述类型的对象。工厂构造函数有一些在上面 class 中定义的参数。创建对象所需的其他参数在工厂方法中定义。
我想问:是否也应该验证传递给工厂构造函数的参数 - 以与 class 构造函数中相同的方式?
感谢您的时间和耐心等待。有什么问题随时问我。
我也准备了一个例子(在PHP)。关于它,validateColor
方法是否也应该在 HatFactory
中定义,尽管相同的验证已经在 Hat
class?
中进行了
test.php
<?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>';
Tests/Hat
<?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!');
}
}
}
Tests/HatFactory.php
<?php
namespace Tests;
use Tests\Hat;
class HatFactory {
/**
* Hat color.
*
* @var string
*/
private $color;
/**
* @param string $color Hat color.
*/
public function __construct(string $color) {
$this->validateColor($color);
$this->color = $color;
}
/**
* Create a hat.
*
* @param string $brand Hat brand.
*/
public function createHat(string $brand) {
return new Hat($brand, $this->color);
}
/**
* Validate the hat colour.
*
* @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!');
}
}
}
在我看来,考虑到您对工厂的实施 - 其中颜色也是构造函数参数 - 您还应该添加验证,因为颜色是工厂本身的 属性,并且工厂不应该处于无效状态...
认为 $color
属性 仅在 createHat
方法中使用,该方法创建一个 Hat
对象,但没有什么可以阻止它将来 属性 也可能用于其他用途......也许你添加一个 createTopHat
方法来创建一个 TopHat
在构造函数中没有验证......或者您可能想添加一个 getColor
方法,以便按颜色组织您的工厂...或任何您能想到的!
如果颜色是 createHat
方法本身的参数,那么您应该避免重复验证,但只要工厂要求存在有效颜色,就应该对其进行验证...
就是说,假设 Hat
和 HatFactory
的颜色验证始终相同(这似乎是 现在 ,但是不需要!),您可以将其移动到某些 ColorValidator
class 以保持 DRY - 这是一个好主意 imo
美好的一天。我希望你能帮助我。
比方说,我有一个 class。它的构造函数有一些参数。在构造函数内部,验证在实例化时作为参数传递的一个或多个值。如果其中之一无效,则抛出异常。
我也有一个工厂class,他的工厂方法应该创建一个上述类型的对象。工厂构造函数有一些在上面 class 中定义的参数。创建对象所需的其他参数在工厂方法中定义。
我想问:是否也应该验证传递给工厂构造函数的参数 - 以与 class 构造函数中相同的方式?
感谢您的时间和耐心等待。有什么问题随时问我。
我也准备了一个例子(在PHP)。关于它,validateColor
方法是否也应该在 HatFactory
中定义,尽管相同的验证已经在 Hat
class?
test.php
<?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>';
Tests/Hat
<?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!');
}
}
}
Tests/HatFactory.php
<?php
namespace Tests;
use Tests\Hat;
class HatFactory {
/**
* Hat color.
*
* @var string
*/
private $color;
/**
* @param string $color Hat color.
*/
public function __construct(string $color) {
$this->validateColor($color);
$this->color = $color;
}
/**
* Create a hat.
*
* @param string $brand Hat brand.
*/
public function createHat(string $brand) {
return new Hat($brand, $this->color);
}
/**
* Validate the hat colour.
*
* @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!');
}
}
}
在我看来,考虑到您对工厂的实施 - 其中颜色也是构造函数参数 - 您还应该添加验证,因为颜色是工厂本身的 属性,并且工厂不应该处于无效状态...
认为 $color
属性 仅在 createHat
方法中使用,该方法创建一个 Hat
对象,但没有什么可以阻止它将来 属性 也可能用于其他用途......也许你添加一个 createTopHat
方法来创建一个 TopHat
在构造函数中没有验证......或者您可能想添加一个 getColor
方法,以便按颜色组织您的工厂...或任何您能想到的!
如果颜色是 createHat
方法本身的参数,那么您应该避免重复验证,但只要工厂要求存在有效颜色,就应该对其进行验证...
就是说,假设 Hat
和 HatFactory
的颜色验证始终相同(这似乎是 现在 ,但是不需要!),您可以将其移动到某些 ColorValidator
class 以保持 DRY - 这是一个好主意 imo