web-dev-qa-db-ja.com

プログラムでフロントエンドとバックエンドの検証が同期されるようにする正当化

最近の多くのJavaScriptベースのリッチWebアプリと同様に、フロントエンドに実装されたいくつかの複雑な検証ルールがあります。同じ規則がJavaバックエンドで正確に繰り返されていると思われますが、常に小さな偏差を見つけます。

DRY原則の信者として、これを体系的に修正するために何かを行う必要があると思います。理想的には、両側で同じコードを実行し、同じルールを使用する必要がありますが、バックエンドでJavaScriptを実行するので許可されていません。メタファイの検証ルールを再利用することしかできません。幸い、GitHubで、JSR-303アノテーションベースの検証でこれを実行できるライブラリが見つかりました。ただし、まだ多くの書き換えとリファクタリングが必要です。

一方、ルールの数は制限されており(合計で<80)、現在のコードは明確で理解しやすいです(ifステートメントの束だけ)。検証フレームワークを使用すると、すべてのカスタムバリデーターがラップされ、開発中にすぐには表示されない生成されたメタデータの背後に隠れる必要があるため、追加の学習曲線が多くなります。

コードを改善するという私の目標は、本当に保守性を損なうだけのようです。これに関する人々の経験は何ですか?

5
billc.cn

いくつかのルールベースのDSLを使用して、フロントエンドとバックエンドの両方で使用される検証ルールを指定できます。ただし、これには、フロントエンドとバックエンドの両方で、これらの検証ルールを読み取って実装するためのコードが必要です。これにより、コードを読み取って実装する検証ルールを2回記述する必要があるという問題が発生します。これにより依然として不整合が生じる可能性があり、コードベースのサイズが増加し、コードの複雑さが増します。

コードの複雑さと一貫性のないルールチェックのリスクを軽減する方法は、すべての検証をサーバー側にオフロードすることです。次に、JavaScriptコードはAJAX呼び出しを使用して、入力を検証するバックエンドを要求します。フロントエンドは検証ルールについて何も知らず、入力が有効かどうかを通知されるだけです。

2
David Arno

私の経験では、クライアントとサーバーの検証は多くの場合、正当な理由で異なります。

一般に、サーバー側の低レベルのプロセスは、おそらく短い説明、おそらくエラー番号とともに例外をスローします。これは、エンドユーザーに表示するのではなく、エラーログに記録するためのものです。

クライアント側のエラーは、電話をかける前に処理され、問題を強調するUI要素を使用して、ユーザー独自の言語で説明的なエラーメッセージを表示します。

これにより、検証の実行方法、返されるエラーメッセージ、および検証の実際のロジックの両方に違いが生じます。

たとえば、私のお気に入りの例を見てみましょう。長いフォームは、各ステップで検証される短いフォームの「ウィザード」セットとして表示されます。ユーザー入力の検証は分割され、各段階で行われます。サーバー側ロジックが一度にすべてのデータを期待するのと同じように。

3
Ewan