0

次のようなエンティティ クラスがあるとします。

class car
{
  private $price;
  private $color;

  public __get($name){ ... }
  public __set($name, $value){ ... }
  ...
}

そして、このようなマネージャークラス:

class CarDealer
{
  private $db;

  public __construct(IDatabase $db) {...}
  public sell(Car $car) {...}
  public insert(Car $car) {...}
  ...
}

問題は、車のプロパティを検証するにはどうすればよいかということです。ifステートメントでチェックすることにより、car クラスのセッター メソッドでこれを行うことができます。

しかし、検証サービス Symfony\Component\Validator が既にある場合は、これを使用する必要があります。ここでは、バリデータ サービスがどこから来たのか判断できません。

a) このバリデーターに依存して、car クラスのコンストラクターのパラメーターとして使用することができます。しかし、この注入、エンティティへの注入は悪い考えだと言われています。これは本当ですか?

b) car クラスのコンストラクターでバリデーター オブジェクトを直接インスタンス化できます。ただし、今回は、依存関係が非表示になります。これも悪いアプローチですよね?

c) マネージャ クラスに何かを注入しても問題ないという観点から、マネージャ クラスのエンティティを検証できます。しかし、繰り返しになりますが、これは悪い設計です。この責任は管理者ではなく、エンティティ自体にあります。右?

エンティティを検証するための最善の、または従来の方法は何ですか?

詳しい説明

Validator私の知る限り、次のアプローチはクラスへの依存関係を隠します。これは悪いことですよね?

class car
{
  private $price;
  private $color;

  public __get($name){ ... }
  public setPrice($price} {
    $validator = new Validator();
    $validator->assert($price, '...some constraint...');
  }
  ...
}

また、車のクラスはそのエンティティに直接関連しないものに依存しているため、これも悪いことですよね?

class car
{
  private $price;
  private $color;

  private $validator;

  public __construct(Validator $validator){
    $this->validator = $validator;
  }

  public __get($name){ ... }
  ....
  public setPrice($price} {
    $this->validator->assert($price, '...some constraint...');
  }
  ...
}

では、外部サービスで価格を検証するにはどうすればよいでしょうか?

4

1 に答える 1

0

魔法の代わりに単純なアクセサー (getPrice/setPrice) を使用することを検討すると、セッターで値を直接検証できます。

a - ではありませんが、エンティティの場合は必ずしも便利ではありません。
b - はい、コンストラクターのロジックは悪い考えです。
c - はい、クラスの「マネージャー」名はすでに悪い兆候です (詳細: 12 )。クラスは、エンティティのすべての検証によってすぐに爆発します。

于 2013-09-25T10:55:24.343 に答える