3

フォームの検証とビジネスの検証について質問があります。ある種のフォーム検証ライブラリを使用する多くのフレームワークを目にします。いくつかの値を送信すると、ライブラリがフォームからの値を検証します。うまくいかない場合は、画面にいくつかのエラーが表示されます。すべてが計画どおりに進むと、値がドメイン オブジェクトに設定されます。ここで、値が検証されるか、より適切に言えば、(再び) 検証される必要があります。ほとんどの場合、検証ライブラリで同じ検証が行われます。この種の構造 Zend/Kohana を持つ 2 つの PHP フレームワークを知っています。

プログラミングと、Don't Repeat Yourself (DRY) や単一責任の原則(SRP) などのいくつかの原則を見ると、これは良い方法ではありません。ご覧のとおり、2回検証されます。実際の検証を行うドメイン オブジェクトを作成してみませんか。

例: ユーザー名と電子メール フォームを含むフォームが送信されます。ユーザー名フィールドと電子メール フィールドの値は、ユーザー名と電子メールの 2 つの異なるドメイン オブジェクトに入力されます。

class Username {}
class Email {}

これらのオブジェクトはデータを検証し、有効でない場合は例外をスローします。同意しますか?このアプローチについてどう思いますか?検証を実装するより良い方法はありますか? このようなものを処理する多くのフレームワーク/開発者について混乱しています。それらはすべて間違っていますか、それともポイントがありませんか?

編集:クライアント側の種類の検証も必要であることはわかっています。これは私の意見では別の球技です。これについてコメントがあり、この種のものに対処する方法がある場合は、提供してください。

4

6 に答える 6

6
  • フォーム検証 (クライアント側) は、実際には使いやすさのためだけです
  • ビジネスの検証こそが真の検証

あなたのアプリケーションはおそらく、フォーム検証と呼ばれるものがなくても機能しますが、ユーザーにとって見栄えが悪いだけです。ただし、データの破損を防ぐためにビジネス検証が必要です。

于 2009-12-23T12:23:20.117 に答える
3

DRY 原則に違反しているように見えますが、実際には、プレゼンテーションとビジネスという 2 つの異なるレイヤーでデータを検証しています。検証の問題は、これら 2 つの層の間で異なる場合があります。プレゼンテーション層では、ビューに関連する特定の要素に関心がある場合があります。つまり、Web アプリでは、html div を含む特定の検証メッセージを返して、ajax 応答を適切にレンダリングできるようにする必要がある場合があります。

また、フォームには通常、特定のフォーム フィールドを null として持たない、フィールド サイズを制限するなどの永続性関連の制約が含まれますが、ビジネス上の制約はより広い場合があります。過去の成功した購入。

とは言うものの、hibernate バリデーター (Java 上) などのフレームワークがあり、ビジネス エンティティに検証メタデータを含めることができます。このメタデータは、永続化される前に、またはその API を呼び出して手動で行うときにチェックされます。それを使用すると、すべての制約を 1 か所で検証できます。

于 2009-12-23T14:19:39.010 に答える
1

ビジネスドメインオブジェクトを使用してフォームも検証する場合、これはかなり単純なツールを使用して実現できます。これにより、ほとんどのバリデーターベースのソリューションの煩わしさがなくなります。ある意味で、ビジネスドメインからフォームドメインへの部分的な動作を推定する必要があります。これにより、コードが削減され、メンテナンスが改善されますが、余分な配線が必要になります。私はロバートに同意します。このアプローチは、Zend / Cake/Ciなどよりも優れていると思います。裸のオブジェクトの哲学の方向に進んでいるようです。VとCをダンプするだけで、モデルのみにアクセスできます:http: //en.wikipedia.org/wiki/Naked_objects

于 2009-12-23T13:54:34.013 に答える
1

あなたが説明しているアプローチは、私には少し過剰に設計されているように見えます。私はそれが理論的にはきれいできれいであることを見ることができますが、実際の状況でデータにマッピングするには少し細かすぎるように思えます.もの。そのようなことに出くわすと、Solution Sprawl の匂いが少しし始める傾向があります。また、プリミティブの周りにフィールドごとのラッパーがたくさんある場合、「AddressLine1」クラスと「AddressLine2」クラスなどの間で DRY 違反が発生する可能性が非常に高くなるか、それらを回避するために複雑すぎる継承階層が必要になります。

これは第 6 正規形のようなもので、理論的には興味深いものですが、そのようにコードを記述した場合、何かを完了するのに非常に長い時間がかかり、メンテナンスは悪夢になります。

于 2009-12-23T12:51:56.113 に答える
0

両方の場所で検証することは冗長ですが、必要です。ユーザーの UI エクスペリエンスが向上するように、クライアントで検証する必要があります。また、サーバーの負荷も軽減されます。ネットワーク経由で送信されるものはアプリによって信頼されるべきではないため、サーバー側でも検証する必要があります。

于 2009-12-23T14:05:24.643 に答える
0

Web では、おそらく「最初のゲート」として何らかのクライアント側の検証が必要です。データが有効でないことを確認するためだけにユーザーが Web リクエストを実行する必要はなく、必要な値やその他の単純な検証ルールを確認します。その上に、オブジェクトのプロパティやその他のビジネス ルールの実際の検証を実行するサーバー側の検証レイヤー (ドメイン オブジェクト、サービス レイヤー、またはその他の場所に組み込まれている) が必要です。
ただし、ドメイン依存の検証規則 (たとえば、 aNameに必要なプロパティFirstNameとがあるLastName) と純粋なビジネス ルール (たとえば、 aが指定Stateされている場合は でCountryなければならないUSA) は、必ずしも同じ場所にある必要はありません。

于 2009-12-23T10:38:13.813 に答える