0


0

データ検証のパフォーマンスを向上させる

次の例は明らかに架空のものですが、使用しているコードベースで検証がどのように行われるかを再開します。

TypeAには、次のシグネチャを持つ2つのメソッドがあります。

public void FirstMethod(TypeB param)
public ValidationResult TryFirstMethod(TypeB param)

FirstMethodが呼び出されると、パラメーターの検証を実行する必要があります。 +したがって、TryFirstMethodを呼び出して、検証の結果を表すオブジェクトを取得します。 + ValidationResultのインスタンスがすべてが正常であると言った場合、実行は続行します。そうでない場合、例外がスローされます。

TryFirstMethodのユーティリティは、架空のTypeCである呼び出し側がこのメソッドを実行し、実際のメソッドがスローするかどうかを確認できることです。 ValidationResultのプロパティを調べることにより。 +また、ValidationResultのインスタンスには、入力が間違っていた理由、その修正方法などに関する情報が含まれています。 +これは、たとえばブール値を使用する代わりに、このタイプの必要性を正当化します。

実際には、これはかなりうまく機能し、データを検証し、ローカライズされたエラーメッセージをユーザーに返すことは非常に簡単です。

唯一の問題は、特定のチェックが非常に複雑であるため、2回実行すると少しコストが高くなることです。 +これらは最初に実際のメソッドがスローしないことを確認するために呼び出し元によって行われます。 +そして、問題のメソッドによって、入力が有効であることを確認します。

チェックを2回実行することを避けるための明確な方法が見つかりません。 +物事をより複雑にするために、ソリューションは標準のメソッド、コンストラクター、そしてTypeBがstringやintのような「プリミティブ」タイプでも動作する必要があるという事実があります。

3 Answer


1


コアロジックは次のようなもののようです。

  1. 「TypeB」を検証します(「TryFirstMethod」を呼び出します)。

  2. 有効でない場合は、エラーメッセージを表示します。

  3. 有効な場合(そして、おそらく他のメンバーも有効な場合)、次に データに対して操作を実行します(「FirstMethod」の一部として?)。

  4. データ操作( FirstMethod)は入力を再検証します。

これが(ある程度)正しい場合、デザインを次のように変更できるはずです。

  1. `FirstMethod`を呼び出します。

  2. データを検証します。

  3. 無効な場合、検証例外をスローします。

  4. 有効な場合、データ操作を実行します。

UIはその後、 `FirstMethod`を呼び出し、例外がスローされない限り操作が成功することを期待します。その場合、現在のように検証メッセージを表示します。 この設計では、検証を1回だけ実行します。


0


最初のメソッドはvoidなので、なぜそれを呼び出してValidationResultを返すようにしないのですか?

最初のコードと2番目のコードが同じコードを2回実行する必要がある理由を教えてください。

あなたは単に最初のものを失敗させ、そのルートのユーザーにエラーメッセージを返すことができます…​


0


私の目に最もきれいな解決策は、3番目の方法です。

public void FirstMethod(TypeB param, ValidationResult alreadyPerformedResult)

したがって、ユーザーは独自のチェックを行い、チェックの結果を使用して目的の関数を呼び出すことができます。 そのため、チェックをスキップして、テストの結果も基準を満たしているかどうかをテストできます。

ValidationResultに何かを追加できるかもしれません(例: 関数名(最も単純なシナリオでは文字列))であるため、指定された結果は、TryMethod()と呼ばれる別のメソッドからではなく、実際にこのメソッドからのものであることが確実です。