3

複雑な計算を実行する必要があります。私の場合、(戦略パターンを使用して抽象化された) Calculator クラスを作成するのが最も自然に思えました。

計算を実行するには、クラスは約 20 の入力を受け入れる必要があります。そのうちのいくつかはオプションであり、将来変更される可能性があるものもあります。Calculate()メソッドが呼び出されると、約 20 の異なる変数を出力する必要があります。

これを実現する方法はいくつかあります。

  • 計算メソッドにパラメーターとして渡される入力
  • Calculator のプロパティを介して渡される入力
  • 入力は独自のクラスにまとめられ、Calculate() メソッドに渡されます。
  • クラスにラップされた Calculate() によって返される出力
  • Calculate() メソッドに渡されるパラメーターに入力される出力
  • Calculate() が呼び出された後に、Calculator のパブリック プロパティから取得された出力

これらすべての方法には長所と短所があります。どのようにしますか?

更新: フィードバックをお寄せいただきありがとうございます。

この計算機の目的は、見積もりを作成することです。入力には、顧客の住所、金利、目標利益、追加料金、製品 ID などがあります。出力には、見積もり、実際の利益、その他の料金などが含まれます。

ICalculateInput および ICalculateOutput インターフェイスとそれらの具象クラスを作成したところ、システムは非常にうまく機能するようになりました。Calculator クラスは、ICalculator インターフェイスからも継承します (関連する計算は、製品の供給元の会社によって大きく異なるため)。

4

10 に答える 10

4

お勧めします

  • 入力は独自のクラスにまとめられ、Calculate() メソッドに渡されます。
  • クラスにラップされた Calculate() によって返される出力

Calculator に状態を保存することは、複数ステップの計算がある場合、または基本的な計算ステップが複数回実行される可能性があり、入力の再入力が難しい場合にのみ意味があります。そうしないと、マルチスレッド化したり、コードのさまざまな部分で同じオブジェクトを再利用したりするときに失敗する悪い抽象化です。

多くのパラメータを持つことは、保守と読み取りが難しく、物事を変更する必要がある場合に柔軟性がありません

パラメータを変更して出力を生成するのは悪い考えです。彼が「所有する」クラスが関数に渡されることによって変更されたことは、呼び出し側からは明らかではありません。

于 2008-12-08T22:35:19.143 に答える
3

ほとんどの人は、「パラメータ クラス」と「結果クラス」の使用を提案しています。私はこのアプローチに同意しますが、あなたのパラメータはいくつかのカテゴリに分類されるようです。おそらく、必須パラメーター用のパラメーター クラスを作成し、オプション パラメーターまたはオプション パラメーターのグループ用に別のパラメーター クラスを作成できます。このようにして、必要な計算の種類に応じてさまざまなメソッドを作成できます。

Result calculate(RequiredArgs requiredArgs) {
...
}

Result calculate(RequiredArgs requiredArgs, OptionalArgs optionalArgs) {
}

Result calculate(RequiredArgs requiredArgs, OptionalArgs optionalArgs, OtherOptionalArgs oOpitonalArgs) {
}

これにより、API が使いやすくなります。異なるグループのクラスを作成したくない場合は、マップを使用することもできますが、これには計算エンジンでより多くの検証コードが必要になります。通常、私はパラメーター クラスを好みますが、決定的な問題を解決するには、特定の問題について詳しく知る必要があります。

スレッドの安全性とオブジェクトの再利用性のために、計算エンジン自体に計算結果を保存しません。ステートレスなコードを維持する方がはるかに簡単です。

于 2008-12-08T23:11:56.463 に答える
1

あなたは省略しました

  • 辞書に配置された入力は、Calculateに渡されます

1つの関数に20個の入力があるのはなぜだろうか...過剰に思えます。ただし、それらが必要で、一部はオプションであり、計算方法が将来Strategyパターンを介して変更される可能性がある場合は、名前付き変数のコレクションを渡すことが理にかなっている可能性があります。コレクションでストラテジーパターンを指定することもできるので、Calculateメソッドは完全に汎用的です。

于 2008-12-10T00:32:18.797 に答える
1

入力と出力を独自のクラスに含める必要があることに同意します。

パラメータの一部またはすべてがオプションの場合、入力オブジェクトを作成するためにBuilder パターンを使用することを検討してください。

于 2008-12-08T23:31:39.123 に答える
1

長いパラメーター リストは面倒でエラーが発生しやすくなります。アプリケーションと環境についてもう少し教えてください。一般的に、何らかのクラスのオブジェクトを渡すか、リストなどを使用したくなるでしょう。

これに対処するためのかなり気の利いた方法の 1 つは、Composite パターンを使用することです。Java では、たとえば、Parameter のインターフェイスを作成してから、Parameter を実装するオブジェクトのリストを作成できます。

于 2008-12-08T22:35:01.467 に答える
1

経験則として、3 ~ 4 個を超える個々のパラメーターを受け入れるメソッドを作成しないでください。

JavaScript でやってはいけないこと:

var addUser = function (name,surname, age, add1, add2, telephone) {
    //do something
};

上記の代わりに、次のようなことを行う方がよいでしょう:

var addUser = function (userDetails) {
    //Do something with userDetails.name etc...
};
//Then invoke the function by passing in an object:
var ud = {name : 'Andreas', surname : 'Grech', age : 20, add1 : 'bla', add2 : 'bla', telephone : 12343}; 
addUser(ud);

そうすれば、好きな順序でパラメーターを入力することで、関数を壊すことなく呼び出すことができ、一部をスキップすることもできます

于 2008-12-08T22:35:32.807 に答える
0

すでにこれについてよく考え、これらすべてのパラメーターが本当に必要であると判断したと仮定します。

名前付きパラメーターを使用する可能性が最も高いですが、私が選んだ言語 (Perl) は、順序に依存しない名前付きパラメーターをサポートしています。そうでない場合は、オブジェクトを渡すことが次善の選択です。特定の順序 (名前の有無にかかわらず) で 2 ~ 3 個を超えるパラメーターを渡さなければならないことは、問題を引き起こしているだけです。

出力については、返される値が複数ある場合は、おそらくオブジェクトを返します。

于 2008-12-10T01:25:02.747 に答える
0

言語については言及していませんが、c# と仮定します。おそらくそれらを構造体 (またはクラス) として渡し、同じ方法で出力を返します。

または、それをリファクタリングして、予想される入出力を簡素化する方法を見つけます。

于 2008-12-08T22:30:31.023 に答える
0

.net のデータベース プロバイダ クラスが行うことを試してください。

パラメーター クラス (入力/出力などの方向を持つ型と値のプロパティを持つ) を持ち、電卓のプロパティとしてパラメーター (パラメーターのコレクション) を持ちます。

詳細については、ストアド プロシージャ/関数の呼び出しに使用される .net の OleDBCommand/SQLCommand クラスを参照してください。

于 2008-12-08T22:32:39.413 に答える
0

個人的には、カスタムの入力および出力構造体またはクラスを作成し、それらを事前設定して渡し、出力構造体またはクラスの戻り値を受け取ります。

于 2008-12-08T22:34:52.170 に答える