まず第一に、検証は、検討する必要があるさまざまなコンテキストの一部が原因で、やや滑りやすいテーマだと思います。最終的に、さまざまなアプリケーション層で実行される検証ルールが存在します。少なくとも、ドメイン オブジェクトには標準的なガードが必要です。Reigster
これらは、適切に設計されたオブジェクトの一部であり、メソッドに対するあなたの意見に適合する必要がある、定期的な前提条件と引数のチェックです。lazyberezovsky が述べたように、これはオブジェクトが無効な状態になるのを防ぐためです。私はこれについて常に有効な学校の側にいます。エンティティを無効な状態で永続化する必要がある場合は、この目的のために新しいエンティティを作成する必要があると思います。
ただし、このアプローチだけの問題の 1 つは、これらの検証ルールをプレゼンテーション層などの他の層にエクスポートする必要があることが多いことです。さらに、プレゼンテーション層では、ルールを異なる形式にする必要があります。それらはすべて一度に表示され、潜在的に別の言語 (JavaScript などの別の言語に翻訳されて、クライアント側のフィードバックがすぐに得られるようにする必要があります) に表示される必要があります。クラスによって発生した例外から検証規則を抽出しようとするのは、困難または非現実的です。または、検証ルールをプレゼンテーション層で再作成することもできます。これははるかに単純で、DRY に違反する可能性がありますが、ルールをコンテキストに依存させることができます。特定のワークフローでは、エンティティ自体によって適用されるものとは異なる検証ルールが必要になる場合があります。
説明したアプローチのもう 1 つの問題は、エンティティの範囲外に存在する検証規則が存在する可能性があり、これらの規則を他の規則と一緒に統合する必要があることです。たとえば、ユーザー登録の場合、電子メール アドレスが一意であることを確認するという別のルールがあります。該当するユース ケースをホストするアプリケーション サービスは、通常、このルールを適用します。ただし、このルールをプレゼンテーションなどの他のレイヤーにエクスポートできる必要もあります。
全体として、エンティティは常に有効であるべきだと考えているため、エンティティ自体にできるだけ多くの制約チェックを配置しようとしています。場合によっては、例外を発生させ、外部レイヤーにエクスポートできるようにルール フレームワークを設計することができます。また、レイヤー全体でルールを単純に複製する方が簡単な場合もあります。