0

与えられた Web サービス メソッド:

public void FindSomeEntities(int? Id, string param1, int? param2, ...)

リファクタリング:

public void FindSomeEntities(SelectionParameters selectionParameters)

class SelectionParameters
{
    public int? Id;
    public string param1;
    public int? param2
    ...
}

長所:

  1. 元の Web サービス メソッドのパラメーターが多すぎて、1 つだけに削減されました
  2. 変更する必要がある場合、メソッドのインターフェースを変更する必要はありません - SelectionParameters の定義のみです。

短所:

  1. class SelectionParameters にはビジネス上の価値はありません。ヘルパー クラスとしてのみ使用され、単一のメソッドで使用されます。その結果、1 つのパラメーターと多数の 1 回限りのクラスを持つ多くのメソッドが作成されます。
  2. 実際にはインターフェイスが変更されました。これらの変更をもう少し深く押し込んだだけです。
4

3 に答える 3

2

あなたが言うように、サポートするクラスの数は維持するのが面倒で、他の目的に役立たないため、この種のリファクタリングに大きな価値があるかどうかはわかりません。

例の「ID」のように、パラメーターに明確な目的がある場合は、それらを識別しやすくし、メソッド本体でそれらを使用して何をしたいのかを簡単に区別できるようにすることが賢明だと思います。

ただし、パラメーターがメソッド本体で同様の/同じ機能を実行する値のコレクションにすぎない場合は、paramsキーワードを使用して、次のようにメソッドを定義することができます。

public void FindSomeEnteties(params object[] theParameters)

配列を掘り下げてインデックス 0 を取り出して ID などとして扱う必要があるかどうか、または渡されたすべてのパラメーターに対してメソッドが単に同じことを行いたいかどうかによって異なります。

于 2012-05-10T11:24:35.633 に答える
2

このリファクタリングはIntroduce Parameter Objectと呼ばれます。パラメーターが自然に相互に関連している場合、特に複数のメソッドへのパラメーター リストとして頻繁に一緒に使用される場合は、良い考えである可能性があります。

于 2012-05-10T11:35:57.123 に答える
0

パラメータの同じ (サブセット) セットが他の Web サービスによって共有されていると考える何らかの理由がある場合、これは合理的です。

そうしない場合でも、引数リストとしてデファクト構造体があります。この観察は、「?」という名前の関数への単一の引数を常に持つPARLANSEプログラミング言語で実現されます。(OOの「自己」のようなもの)。その引数には型があります。スカラー変数または複素数変数 (int または string) にすることも、構造体にすることもできます。通常、構造体宣言によって構造体を定義します。PARLANSE では、複数の引数のように見えるものを記述すると、暗黙的に構造体が定義されます。引数リストが子関数に渡される場合、単にその子関数を「?」で呼び出すことができます。引数リスト全体が渡されます。

于 2012-05-10T12:03:57.633 に答える