4

データベースを照会する検索関数があり、最大15個のオプションのパラメーターがあります。明らかにこれはきれいではなく、それを呼び出すのは少し混乱しています。PHPはメソッドのオーバーロードを許可していないので、私は巨大な関数シグネチャを作成しています。

他の場所では、パラメータクラスの作成などの提案を見てきました。多くのパラメータを使用することのデメリット

しかし、これは重すぎるようです。連想配列を渡すこともできますが、これによりパラメーターの数が減りますが、配列にどのキーが存在するかを示すドキュメントが組み込まれていないため、追跡が容易ではないと思います。

これを優雅に処理する他の方法はありますか?通常、他の言語では、最大12個のパラメーターを受け取り、それらのパラメーターのサブセットを受け入れ、内部でプライベートメソッドを呼び出す同じ名前のメソッドをprivate作成する非常に醜いメソッドがあります。public

4

6 に答える 6

4

PHPでは、連想配列を使用できます。

someFunction(array(
    "a" => 3243,
    "b" => 2354,
    "c" => 33453,
    "d" => 324353,
    "e" => 321243,
    "f" => 321243,
    "g" => 312243,
    "h" => 321243,
))

または、関数が呼び出されているオブジェクトのプロパティ(意味がある場合)。PHPMailerは次のようなメールを送信します。

// instantiate the class
$mailer = new PHPMailer();

// Set the subject
$mailer->Subject = 'This is a test';

// Body
$mailer->Body = 'This is a test of my mail system!';

// Add an address to send to.
$mailer->AddAddress('foo@host.com', 'Eric Rosebrock');

if(!$mailer->Send())
{
    echo 'There was a problem sending this mail!';
}

そして、それはより多くのオプションのパラメータを持っています。100個のパラメーターを持つメソッドを使用することもできますが、これははるかに読みやすくなります。

編集:これらのソリューションは、オプションのパラメーターもより適切にサポートします。プロパティの場合は簡単です。連想配列の場合は、配列をデフォルト値の配列とマージできます。

于 2011-02-08T13:19:46.477 に答える
2

一般に、長いパラメータリストは、コード内のいわゆる悪臭であり、Introduceパラメータオブジェクトと呼ばれるリファクタリングを介して削除できます。これを参照してください。

Cheeres

于 2011-02-08T13:31:15.367 に答える
1

はい、経験則として、パラメータは3〜4個以下にすることをお勧めします。それ以上が必要な場合は、通常、パラメータの1つとして配列またはオブジェクトを使用する必要があります。しかし、場合によっては、本当にもっと多くのパラメータが必要だと思うなら、確かにそうしないでください。コードが理解しやすく、使いやすいのであれば、そうしないでください。

于 2011-02-08T13:27:35.683 に答える
0

パラメータをプロパティとして格納するクラスを作成して、必要に応じて各プロパティを設定し、これらのプロパティを使用してデータベースにクエリを実行するメソッドを作成できます。コンストラクターは、これらのプロパティのデフォルト値を設定できます。これにより、呼び出しが少し簡単になります。

$function = ClassFunction();
$function->arg1 = 'Some value.';
$function->arg2 = true;
$function->arg3 = 5;

$result = $function->call_method();    // This uses default values for any property not set.
于 2011-02-08T13:25:48.003 に答える
0

私の意見では、「パラメータが多すぎる」という問題は、はるかに深い根底にある問題、つまり悪いアーキテクチャの現れにすぎません。関数が本当にこれらすべてのパラメーター値を必要とする場合、関数が必要以上に多くのことを実行している可能性が非常に高くなります。

これは、「ああ、手順Xを使用してすべてのことを行うのではなく、Xが実際に何をすべきか、YとZが何をすべきかを考え直そう。

于 2011-02-08T13:48:17.673 に答える
0

関数をクラスに変換すると便利です。2つの主な利点があります。

  • 関数の引数はプロパティに変換され、コメント化できます

  • かなり大きいと思う関数コードは、小さなプライベートメソッドのセットに分割できます

于 2011-02-08T17:49:28.687 に答える