3

関数に多くの値を渡す必要があり、これらの一部はオプションである可能性がある場合に、メソッドシグネチャを定義するための最良の方法は何ですか。そして将来的には、より多くの変数を渡すか、関数に与えられたいくつかの渡された値を減算する必要があるかもしれません。

例:(電話とアドレスはオプションです)

function addInfo( $name, $dob, $phone='', $address='' ) {
       // Store data
}

addInfo( 'username', '01-01-2000', '1111111' ); // address is not given

また

function addInfo( $info ) {
    // Store data
}

$info = array( 'name'=>'username', 
               'dob'=>'01-01-2000', 
               'phone'=>'1111111', 
               'address'=>'' );
addInfo( $info );
4

4 に答える 4

4

Martinは、「Clean Code」で、コードを簡単に理解できるように、パラメーターの数を最大で2〜3に制限する必要があると提案しています。したがって、それらをオブジェクトにラップし、オブジェクトをパラメーターとして渡す方がよいでしょう。それは間違いなく好ましいです。

于 2010-09-19T07:14:36.150 に答える
3

もう1つのOOPに似た方法があります。フィールド「name」、「dob」、「phone」、「address」を使用してパラメーターオブジェクト(たとえば、person)を作成します(これは、Fowlerの「リファクタリング」ブックでは「パラメーターオブジェクトのリファクタリングの紹介」と呼ばれます)。関数に渡すすべてのフィールドは実際には1つのオブジェクトに関連しているため、この場合は適切と思われます。

于 2010-09-19T07:09:08.017 に答える
1

関数の2番目のバージョンの方が優れているように見えますが、そうではありません。これは、関数がどのような種類のデータを期待しているかわからないためです。要素の配列は単純に一般的すぎます。オブジェクトは私見によりよく適合します。クラスオブジェクトは明確に定義されています。Employeeオブジェクトで、Employerを使用して関数を呼び出すと、呼び出しは失敗します。

したがって、要約すると、最初のバージョンまたはクラスオブジェクトの方法を使用します。

于 2010-09-19T07:22:41.590 に答える
0

最初のバージョンはより明確であり、したがってプログラマーにとってより使いやすいので、私は最初のバージョンを好みます。プログラマーは、関数が何を期待しているかを一目で確認できます。

関数が多数の(オプションの)引数を受け入れることができる場合は、2番目のバージョンが推奨されます。その場合、それらをバンドルして1つのユニットとして渡すのが理にかなっています。

コメントするパフォーマンスへの影響についてはわかりません。ペナルティがあったとしても、それは厳しくないのではないかと思います。

于 2010-09-19T07:00:59.990 に答える