1

新しいニーズに合わせて関数をリファクタリングしようとすると、次の重要な質問について時々つまずきます。

デフォルト値を持つ別の変数を追加しますか? それとも、API を壊さずに変数を追加できる配列を 1 つだけ使用しますか?

4

6 に答える 6

1

プログラミングの多くの質問と同じように、正しい答えは「状況によって異なります」です。

Javascript / jQueryを例にとると、経験則の1つは、関数が呼び出されるたびにパラメーターが必要になるかどうか、またはオプションであるかどうかです。たとえば、メインのjQuery関数自体には、操作が影響を与える要素を決定するための式が必要です。

jQuery(expresssion)

この関数が呼び出されるたびに必要になるため、このパラメーターを配列の一部として渡そうとしても意味がありません。

一方、多くのjQueryプラグインは、オプションの可能性があるいくつかのその他のパラメーターを必要とします。慣例により、これらは'options'配列を介してパラメーターとして渡されます。あなたが言ったように、これは既存のAPIに影響を与えることなく新しいパラメーターを追加できるので素晴らしいインターフェースを提供します。これにより、ユーザーは適用できないオプションを無視できるため、APIもクリーンになります。

一般に、複数のパラメーターが関係している場合、それらの多くは確かにオプションになるため、それらを配列として渡すことは良い慣例です。これは、JavascriptよりもC / C ++で配列を処理するのが難しいものの、多くのWIN32APIをクリーンアップするのに役立ちます。

于 2009-11-14T20:35:22.320 に答える
1

柔軟な数の変数をサポートする必要がない限り、各パラメーターを明示的に識別するのが最善だと思います。ほとんどの場合、元のメソッド シグネチャをサポートしながら、追加のパラメーターをサポートする別のシグネチャを持つオーバーロードされたメソッドを追加できます。変数を渡すために配列を使用すると、API のユーザーが混乱するだけです。明らかに、配列に役立つ入力がいくつかあります (ポリゴン内のポイントのリスト、アクションを実行したいアカウント ID のリストなど)。配列またはリストの場合、別のパラメーターとしてメソッドに渡す必要があります。

于 2009-11-14T20:27:30.480 に答える
0

彼の著書「CodeComplete」の中で、Steve McConnellは、関数に7つを超える引数を持たせてはならず、その数を超えることはめったにないと定めています。彼は説得力のある議論を提示します-悲しいかな、私は記憶から引用することはできません。

クリーンコードは、最近では、さらに少ない議論を提唱しています。

したがって、渡すものの数が本当に少ない場合を除いて、それらはエンベロープ構造で渡される必要があります。それらが同種の場合、配列。そうでない場合は、その目的のために適度に軽量なオブジェクトを作成する必要があります。

于 2009-11-14T20:38:46.340 に答える
0

どちらもすべきではありません。パラメータを追加し、すべての呼び出し元を変更して適切なデフォルト値を提供するだけです。その理由は、デフォルト値を持つパラメーターは最後にしか配置できず、パラメーター リストの任意の場所に必要なパラメーターを追加することができず、誤解のリスクがないためです。

これらは災害への重要なステップです: 1. デフォルトで 1 つまたは 2 つのパラメーターを追加します。 2. 一部の呼び出し元はそれを提供し、一部はデフォルトに依存します。[半年経過] 3. 必要なパラメーターを (それらの前に) 追加する 4. 必要なパラメーターを受け入れるようにすべての発信者を変更する 5. 電話を受けるか、part# のインスタンスの 1 つを変更するのを忘れさせるようなイベントが発生する2 6. これで、プログラムは完全にコンパイルされましたが、無効です。

残念ながら、関数呼び出しのセマンティクスでは、通常、どの値がどこに行くのかを名前で言う機会がありません。

配列も適切な解決策ではありません。配列は、均一なアクティビティが実行される同様のオブジェクトの接続として使用する必要があります。彼らがここで言うように、リファクタリングする価値があるなら、今すぐリファクタリングする価値があります。

于 2009-12-29T14:24:47.757 に答える
0

使用するプログラミング言語によって異なります。

ありふれた OO 言語を使用している場合、API の一貫性が本当に気になる場合は、簡単に拡張できるオブジェクトを使用する必要があります。

それがそれほど重要でない場合は、メソッドのシグネチャを変更し、メソッドをより多くの/異なるパラメーターでオーバーロードするオプションがあります。

あなたの言語がどちらもサポートしておらず、API をバイナリ安定にしたい場合は、配列を使用してください。

于 2009-11-14T20:30:24.437 に答える
0

考慮しなければならないことがいくつかあります。

  • 関数はどこで使用されますか? - 作成したコードのみですか? 1か所ですか、それとも数百か所ですか?既存のコードを維持するために必要な作業量は重要です。現在関数を使用している可能性のある他のプログラマーと通信するのにかかる時間を忘れずに含めてください。
  • 新しいパラメータはどの程度重要ですか? - 使用を要求しますか? デフォルト値がある場合、そのデフォルト値は関数の既存の使用を微妙な方法で壊しますか?
  • 理解の容易さ - 関数に渡されたパラメーターの数は? 数値が大きいほど、混乱しやすく、エラーが発生しやすくなります。Code Completeでは、パラメーターの数を 7 以下に制限することをお勧めします。それ以上のものが必要な場合は、関連するパラメーターの一部またはすべてを 1 つのオブジェクトに抽象化する必要があります。
  • その他の特別な考慮事項 - コードの速度やサイズなどの特別な条件に合わせて作業を最適化したいですか? 実行環境について考慮しなければならない特別な考慮事項はありますか? プロジェクトの目標を念頭に置き、どのようなデザインを選択しても目標に反しないようにしてください。
于 2009-11-14T20:31:40.737 に答える