新しいニーズに合わせて関数をリファクタリングしようとすると、次の重要な質問について時々つまずきます。
デフォルト値を持つ別の変数を追加しますか? それとも、API を壊さずに変数を追加できる配列を 1 つだけ使用しますか?
新しいニーズに合わせて関数をリファクタリングしようとすると、次の重要な質問について時々つまずきます。
デフォルト値を持つ別の変数を追加しますか? それとも、API を壊さずに変数を追加できる配列を 1 つだけ使用しますか?
プログラミングの多くの質問と同じように、正しい答えは「状況によって異なります」です。
Javascript / jQueryを例にとると、経験則の1つは、関数が呼び出されるたびにパラメーターが必要になるかどうか、またはオプションであるかどうかです。たとえば、メインのjQuery関数自体には、操作が影響を与える要素を決定するための式が必要です。
jQuery(expresssion)
この関数が呼び出されるたびに必要になるため、このパラメーターを配列の一部として渡そうとしても意味がありません。
一方、多くのjQueryプラグインは、オプションの可能性があるいくつかのその他のパラメーターを必要とします。慣例により、これらは'options'配列を介してパラメーターとして渡されます。あなたが言ったように、これは既存のAPIに影響を与えることなく新しいパラメーターを追加できるので素晴らしいインターフェースを提供します。これにより、ユーザーは適用できないオプションを無視できるため、APIもクリーンになります。
一般に、複数のパラメーターが関係している場合、それらの多くは確かにオプションになるため、それらを配列として渡すことは良い慣例です。これは、JavascriptよりもC / C ++で配列を処理するのが難しいものの、多くのWIN32APIをクリーンアップするのに役立ちます。
柔軟な数の変数をサポートする必要がない限り、各パラメーターを明示的に識別するのが最善だと思います。ほとんどの場合、元のメソッド シグネチャをサポートしながら、追加のパラメーターをサポートする別のシグネチャを持つオーバーロードされたメソッドを追加できます。変数を渡すために配列を使用すると、API のユーザーが混乱するだけです。明らかに、配列に役立つ入力がいくつかあります (ポリゴン内のポイントのリスト、アクションを実行したいアカウント ID のリストなど)。配列またはリストの場合、別のパラメーターとしてメソッドに渡す必要があります。
彼の著書「CodeComplete」の中で、Steve McConnellは、関数に7つを超える引数を持たせてはならず、その数を超えることはめったにないと定めています。彼は説得力のある議論を提示します-悲しいかな、私は記憶から引用することはできません。
クリーンコードは、最近では、さらに少ない議論を提唱しています。
したがって、渡すものの数が本当に少ない場合を除いて、それらはエンベロープ構造で渡される必要があります。それらが同種の場合、配列。そうでない場合は、その目的のために適度に軽量なオブジェクトを作成する必要があります。
どちらもすべきではありません。パラメータを追加し、すべての呼び出し元を変更して適切なデフォルト値を提供するだけです。その理由は、デフォルト値を持つパラメーターは最後にしか配置できず、パラメーター リストの任意の場所に必要なパラメーターを追加することができず、誤解のリスクがないためです。
これらは災害への重要なステップです: 1. デフォルトで 1 つまたは 2 つのパラメーターを追加します。 2. 一部の呼び出し元はそれを提供し、一部はデフォルトに依存します。[半年経過] 3. 必要なパラメーターを (それらの前に) 追加する 4. 必要なパラメーターを受け入れるようにすべての発信者を変更する 5. 電話を受けるか、part# のインスタンスの 1 つを変更するのを忘れさせるようなイベントが発生する2 6. これで、プログラムは完全にコンパイルされましたが、無効です。
残念ながら、関数呼び出しのセマンティクスでは、通常、どの値がどこに行くのかを名前で言う機会がありません。
配列も適切な解決策ではありません。配列は、均一なアクティビティが実行される同様のオブジェクトの接続として使用する必要があります。彼らがここで言うように、リファクタリングする価値があるなら、今すぐリファクタリングする価値があります。
使用するプログラミング言語によって異なります。
ありふれた OO 言語を使用している場合、API の一貫性が本当に気になる場合は、簡単に拡張できるオブジェクトを使用する必要があります。
それがそれほど重要でない場合は、メソッドのシグネチャを変更し、メソッドをより多くの/異なるパラメーターでオーバーロードするオプションがあります。
あなたの言語がどちらもサポートしておらず、API をバイナリ安定にしたい場合は、配列を使用してください。
考慮しなければならないことがいくつかあります。