疎結合の 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 メソッドを実際に実装するまでは、すべてが単純明快です。ここには2つのオプションがあります:
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);
}
車輪を再発明したくないし、コードを繰り返したくないので、最初の方法には従いたくないので、2番目の方法に固執しています。
2 番目の方法に従うと、問題が発生します。クラスが別のフレームワーク クラスに依存するようになります。
私の実際の質問は、単純なケースで依存性注入を使用せずに、エンティティ/値オブジェクトで低レベルのインフラストラクチャ クラスを直接使用することが許容されるかどうかです。
この例を「適切に」実装すると、疎結合のためだけに、コードがはるかに複雑になります。isValid 関数で使用される事前構成済みの EmailValidator のインスタンスを値オブジェクト (Email) クラスに提供する EmailFactory を作成する必要があります…</p>