3

まず第一に、どの言語でも問題になる可能性がありますが、私はJavaを使用しています

複雑なシステムを持っているとします。オブジェクトを構築し (すべてのパラメーターを設定)、それを「ターゲットレイヤー」(マネージャー) に渡し、オブジェクトを開きます (パラメーターを取得します)。

すべてのパラメーターを 1 つの関数で渡すと、設計が不十分であると見なされます。関数ごとに少量のパラメーターがあると想定されるためです。

これはもったいないようで、過去にパラメータを「ターゲットレイヤー」に直接設定することも決定しました

この問題に対処する設計パターンはありますか? または、その分野の本や専門家が推奨するものはありますか?

4

4 に答える 4

3

設計メソッドの署名を注意深くカバーするEffective Java Bookをご覧ください。

長いパラメータを短縮するには、次の 3 つの方法があります。

  • メソッドを複数のメソッドに分割し、それぞれがパラメーターのサブセットのみを必要とする
  • パラメーターのグループを保持するヘルパー クラスを作成する (通常は静的メンバー クラス)
  • オブジェクトの構築からメソッドの呼び出しまで Builder パターンを適応させる

あなたは参照を求めているので、それがあなたの問題の解決に役立つことを願っています。ここで本を購入することを忘れないでください

于 2013-10-09T09:23:39.777 に答える
1

パラメーターを独自の "Parameter-Object" (パターン名) に抽出し、そのオブジェクトを関数に渡します。Parameter-Object 自体の構築が複雑な場合、オブジェクトをさまざまな方法で構築できる場合は、構築を簡素化する Builder-Pattern を使用します。

例えば:

function(param1, param2, param3, ...)

次に、パラメータがオブジェクトに抽出されます。

class ParamObject {
  param1;
  param2;
  param3;
}

対応するセッターとゲッターを使用します。

ParamObject を構築するには、 BuilderPattern を使用します

最後に、呼び出しは次のようになります。

function(paramobject):

関数内では、以前の引数がオブジェクトから取得されます。siledh が述べたように: 共通の概念を共有するクラスに引数をグループ化するようにしてください。つまり、paramlist から複数のクラスを作成しても問題ありません。

于 2013-10-09T09:41:02.993 に答える
1

本の参考文献について質問していたので、ここにClean Codeの Chapter 3: Functionsからのものを示します。

関数が 2 つまたは 3 つ以上の引数を必要とする場合、それらの引数の一部を独自のクラスにラップする必要がある可能性があります。[...]

引数からオブジェクトを作成して引数の数を減らすことは、ごまかしのように思えるかもしれませんが、そうではありません。変数のグループが一緒に渡される場合、[...] それらは、独自の名前に値する概念の一部である可能性があります。

したがって、これらのクラスが一貫した概念を表している限り、多くのメソッド引数をクラスにグループ化しても問題ないと思います。

個人的にこういうことをするなら、ラッパークラスはイミュータブルで専用のビルダーで作成するのが好きです。これにより、追加のクラスの数が 2 倍になりますが (ラッパーとビルダー)、そのようなクラスを 1 つのアトミック引数として扱うことができます。

于 2013-10-09T09:30:02.637 に答える
0

これは私にはデータ転送オブジェクトのように聞こえます。

http://martinfowler.com/eaaCatalog/dataTransferObject.html

于 2013-10-09T09:24:57.327 に答える