我有一个与松耦合 OOP 设计有关的问题。考虑我们有一个简单的值对象,比如 Email
final class Email
{
private $_email;
public function __construct($email)
{
self::isValid($email);
$this->_email = $email;
}
public function getEmail()
{
return $this->_email;
}
public static function isValid($email)
{
// some validation logic goes here
return true;
}
}
在我想实际实现 isValid 方法之前,一切都很简单明了。我在这里有两个选择:
1)实现我自己的验证逻辑,这可能非常难看,如下所示:
public static function isValid($email)
{
$v = preg_match(
'/^[-a-z0-9!#$%&\'*+\/\=?^_`{|}~]+(?:\.[-a-z0-9!#$%&\'*+\/\=?^_`{|}~]+)*@(?:[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?\.)*(?:aero|arpa|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|pro|[a-z][a-z])$/',
$email
);
return $v > 0;
}
2)使用一些内置的框架验证器
public static function isValid($email)
{
$validator = new Zend_Validate_Email(); // tight-coupling detected!
return $validator->isValid($email);
}
我真的不想遵循第一种方式,因为我不想重新发明轮子,也不想重复代码,所以我坚持第二种方式。
如果我遵循第二种方式,我就会遇到问题——我的类正在依赖于另一个框架类。
我的实际问题是在简单的情况下是否可以直接在实体/值对象中使用低级基础设施类而不使用依赖注入?
如果我“正确”地实现这个例子,代码会变得更加复杂,只是为了实现松散耦合。我必须创建一个 EmailFactory,它会为我的值对象 (Email) 类提供一个预配置的 EmailValidator 实例,该实例将在 isValid 函数中使用……</p>