web-dev-qa-db-ja.com

フロントエンドで計算を行うのが適切なのはいつですか?

私のチームはWEBベースのファイナンスアプリケーションを開発していて、計算をどこに保存するかを同僚と少し議論しました。

簡単な説明:フロントエンドにJava(ZK、Spring)を使用し、バックエンドにProgress 4glを使用しています。データベースからのハードコア数学とデータを含む計算はバックエンドに保持されます。ユーザーについて値Xを入力すると、値Y(画面に表示)に追加され、結果がフィールドZに表示されます。純粋で単純なjQueryっぽい操作ですね。

したがって、ここでのベストプラクティスは何でしょうか。

1)バックエンドへの行き来を保存するJavaScriptで値を追加し、バックエンドで「保存時」にそれらを検証しますか?

2)すべてのビジネスロジックを同じ場所に保持します。つまり、値をバックエンドに持ってきて、そこで計算を行いますか?

3)フロントエンドで計算を行います。次に、データをバックエンドに送信し、そこで検証し、再度計算を行い、結果が有効で等しい場合にのみ、ユーザーに表示しますか?

4)他に何かありますか?

注:Javaでいくつかの基本的な検証を行いますが、そのほとんどは他のすべてのビジネスロジックと同様にバックエンドにあります。

バックエンドのすべてを再計算することによって送信されるデータの増加は問題になりません(XMLサイズが小さい。サーバーと帯域幅は、ユーザーが実行する操作量の増加に耐えます)。

22
IgnasK

いつものように、そのような決定は異なる目標間のトレードオフを伴い、そのいくつかは互いに矛盾します。

  • 効率性から、フロントエンドで計算を実行することをお勧めします。これは、ユーザーのコンピューターがより多くの電力を使用し、サーバーがより少ない電力を使用するためと、ユーザーがより高速なフィードバックを参照してユーザーエクスペリエンスを向上させるためです。

  • クライアントコンピューターは悪意のある攻撃者の制御下にある可能性があるため、セキュリティでは、すべての状態変更操作できないがクライアントコンピューターでチェックまたは計算されるデータに依存している必要があります。したがって、あなたはmustサーバーサイドの信頼できないソースからのものをすべて検証します。

  • プログラミングの効率と保守性は、無駄な労力のために同じ計算を2度行うべきではないことを示唆しています。

これは表面的にはすべてサーバー側で実行する必要があるかのように聞こえますが、常にそうであるとは限りません。複製されたコードを簡単に維持できる場合(たとえば、サーバー側からJavaScriptバリデーターを自動生成するJavaバリデーター)場合は、計算を繰り返すことが良い解決策になる可能性があります。関連するデータがすべて重要ではありません。たとえば、ユーザーが値を操作する場合、ユーザーだけがごまかすことができる場合は、サーバー側の検証は不要です。応答時間が完全に異なるボトルネックに支配されているため、往復遅延が認識されない場合、その場合、UXの考慮事項は決定的ではありません。したがって、これらの圧力のそれぞれが状況にあるどれだけ強いかを考慮し、それに応じて決定する必要があります。

36
Kilian Foth

バックエンドで計算を行うには強い理由があります

  • ビジネスロジックはプレゼンテーションレイヤーに属していません
  • JavaScriptのビジネスロジックが脅威をもたらす
  • 1つのフロントエンド-> 1つのバックエンドの関係があるとは限りませんが、常にtrueとは限りません、バックエンドは、複数のフロントエンドアプリケーションに対応している、またはサービスを提供していると考える必要があります。したがって、何も想定できません。
  • 計算で大量のデータを使用する場合、それをフロントエンドに保持するのは効率的ではありません
  • 計算でデータベースを使用する場合、それをフロントエンドで複製することはできません

私の推薦

  • 外部キー、主キー、チェック制約、トリガーなど、モデルで可能な限り多くのビジネスルールをデータベースに適用させる
  • ビジネスルールが満たされない場合にビジネスレイヤーに例外をスローさせる(データベースがエラーを返したため、またはビジネスレイヤー自体がデータを検証したため)
  • 応答時間が許容できない場合に限り、Ajaxを使用して検証または前処理を行います(作業は実際にはJavaScriptでは行われず、ページをリロードする必要なくバックエンドで行われます)
  • 空の値、長すぎる値、または範囲外の値を許可しないなど、JavaScriptで簡単な検証を実行できます(後者の場合、バックエンドで範囲を生成することができます)
13