web-dev-qa-db-ja.com

検証フレームワークと不変性

単純なオブジェクトを設計しました検証フレームワーク Javaコードリファクタリングのコンテキストで。

フレームワークには、1つのメソッドErrors validate(MyObject myObject, Context ctx)を持つValidationRuleインターフェイスがあります。さまざまな検証ルールを実装するいくつかのクラス(バリデーター)があり、それぞれの検証はオブジェクトプロパティと子コレクションの異なる部分をチェックします。

ルールはループで実行され、検証エラーが蓄積されてユーザーに返されます。

今、私がリファクタリングしているコードは、いくつかの検証ロジックの「中間」にある検証中のオブジェクトをしばしば変更しています。

if (myObject.getName() == null) {
    myObject.setName(DEFAULT_NAME);
}

特定のルールは、オブジェクトが変更されているという前提に依存しています(たとえば、名前が常にnullでないことを期待しています)。

設計の観点からは、検証フレームワークを「読み取り専用」にしたいと考えています。これにより、ルールの理解と推論が簡単になりますが、特定のオブジェクトのプロパティをルールから次のルールに変更できるようにする必要があります。

そのような結果を達成するための良いパターンは何でしょうか?

1)検証ルールは検証中のオブジェクトを変更しません(これは、検証インターフェイスにImmutableMyObjectを渡すことで強制できます)

2)次のルールが機能するために、各ルールは検証中のオブジェクトを変更できる必要があります

アイデアは大歓迎です!

1

検証ルールのチェーンに対する私の期待は、合格したルールを削除したり、ルールのチェーンを並べ替えたりしても、検証の最終結果は同じままであることです。

つまり、検証ルールは、チェーン内の以前のルールによって実行されたアクションに依存してはならず、検証中のオブジェクトを不変として扱うことで最も簡単に保証できます。

一部の検証ルールで特定のプロパティがnull以外である必要がある場合は、オブジェクトをルールのチェーンに渡す前にそれを調整する必要があります。
いくつかの検証ルールがプロパティAの値Xを期待し、他のルールがそのプロパティの値Yを期待する場合、これらのルールの両方がチェーンに存在する場合、オブジェクトが検証に合格することは期待されません。