まず、バリデーションは、それを考慮する必要がある様々なcontextsに部分的に起因する滑りやすい主題だと思います。最終的に、さまざまなアプリケーション層で実行される検証ルールが存在します。少なくとも、ドメインオブジェクトには標準ガードが存在する必要があります。これらは、よく設計されたオブジェクトの一部であり、Reigster
メソッドのあなたの意見に合った正規の事前条件と引数チェックです。 lazyberezovskyが述べたように、これはオブジェクトが無効な状態にならないようにするためです。私は常に有効な学校と一緒にいます。エンティティを無効な状態にしておく必要がある場合は、この目的のために新しいエンティティを作成する必要があります。
ただし、このアプローチだけでは、これらの検証ルールをプレゼンテーションレイヤーなどの他のレイヤーにエクスポートする必要があることがあります。さらに、プレゼンテーションレイヤーでは、ルールの形式を変更する必要があります。クライアント側からの即時のフィードバックのために、それらを一度にすべて提示し、潜在的に別の言語に翻訳する必要があります。クラスによって発生した例外から検証ルールを抽出しようとするのは、難しく、または実際的ではありません。代替的に、バリデーションルールは、プレゼンテーション層で再作成することができる。これははるかに簡単ですが、潜在的にDRYに違反しますが、ルールはコンテキストに依存します。特定のワークフローでは、エンティティ自体によって実行されるものとは異なる検証ルールが必要になる場合があります。
説明されたアプローチのもう1つの問題は、エンティティの範囲外に存在する検証ルールが存在する可能性があり、これらのルールを他のルールとともに統合する必要があることです。たとえば、ユーザー登録の場合、別のルールは電子メールアドレスが一意であることを確認することです。適用可能なユースケースをホストしているアプリケーションサービスは通常、このルールを適用します。ただし、プレゼンテーションなどの他のレイヤーにこのルールをエクスポートすることもできる必要があります。
全体的に、私はエンティティが常に有効であるべきだと思うので、エンティティ自体に多くの制約チェックを配置しようとします。ルールフレームワークを設計して、例外を発生させたり、外部レイヤにエクスポートできるようにすることが可能な場合もあります。それ以外の場合は、レイヤー間で単純にルールを複製する方が簡単です。
Register()は、パスワード、電子メール、登録日、登録ステータスなどのデータでユーザーを初期化します。リポジトリは呼び出されません。これは、セキュリティアプリケーションサービスの責任です。しかし、それはここでの主な問題ではありません。私はエンティティ操作の例を提供し、検証をどこに置くべきかを分析しようとしました。 – Markus
@ Markusそのようなメソッド名が混乱していると思います。 –