PHP5で自作の関数の引数を以下のコードのように連想配列か、通常の変数にするか悩んでます。


■連想配列
$birthday = array('year'=>2009,'month'=>10,'day'=>9);

function hoge($birthday) {
}

■通常の変数
$year = 2009; $month = 10; $day = 9;

function hoge($year,$month,$day) {
}

基本的に複数人で開発することを想定していますが、
プログラミングをする際、どちらがやりやすいでしょうか?

また、それぞれ考えられるメリット、デメリットがあれば教えてください。
よろしくお願いします。

#なお、URLのみの回答はご遠慮ください。

回答の条件
  • 1人2回まで
  • 登録:2009/04/11 10:30:24
  • 終了:2009/04/18 10:35:02

ベストアンサー

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/04/11 13:43:42

ポイント27pt

function hoge($year,$month,$day) {

}

私だったら、上記の渡し方を選びます。

理由は、アプリケーション内で引数の数をチェックしなくて良いからです。


連想配列で渡す場合は、関数 hoge 内で、引き渡された連想配列の中に要素 year, month, day の3つが存在することをチェックする必要があります。それを行わないで、もし要素が足りなかったり要素名が間違っていたりすると、実行している最中にエラーが起きます。これは、結合テストを行うまで顕在化しないバグ(関数hogeを呼び出す側にバグがある)につながります。

一方、引数で3つを渡すようにしておけば、もし引数の数が足りなければ、スクリプトをロードした時点でエラーが発生します。これなら、単体テストで潰すことができます。


連想配列で渡すメリットは、引数の数も種類も不定である場合です。

良い例が思い浮かばないのですが、こういう処理の場合は、関数内で要素を調べて場合分けを行うはずなので、連想配列の中身をチェックするのと同じ事になります。

id:xxmasaxx

なるほど。参考になりました。

回答どうもありがとうございました。

2009/04/12 12:55:51

その他の回答(2件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/04/11 13:43:42ここでベストアンサー

ポイント27pt

function hoge($year,$month,$day) {

}

私だったら、上記の渡し方を選びます。

理由は、アプリケーション内で引数の数をチェックしなくて良いからです。


連想配列で渡す場合は、関数 hoge 内で、引き渡された連想配列の中に要素 year, month, day の3つが存在することをチェックする必要があります。それを行わないで、もし要素が足りなかったり要素名が間違っていたりすると、実行している最中にエラーが起きます。これは、結合テストを行うまで顕在化しないバグ(関数hogeを呼び出す側にバグがある)につながります。

一方、引数で3つを渡すようにしておけば、もし引数の数が足りなければ、スクリプトをロードした時点でエラーが発生します。これなら、単体テストで潰すことができます。


連想配列で渡すメリットは、引数の数も種類も不定である場合です。

良い例が思い浮かばないのですが、こういう処理の場合は、関数内で要素を調べて場合分けを行うはずなので、連想配列の中身をチェックするのと同じ事になります。

id:xxmasaxx

なるほど。参考になりました。

回答どうもありがとうございました。

2009/04/12 12:55:51
id:purplegogo No.2

nasu回答回数6ベストアンサー獲得回数02009/04/11 12:39:06

ポイント27pt

私なら通常の変数にします。

連想配列の場合、コーディング時にhoge関数の中で引数の$birthday配列のキーが何だったか確認しなきゃならない手間が増える。

また、連想配列のキーに'year','month','day'が存在する保証がないので、バグを誘発することになると思います。

複数人で開発をするのなら、尚更、連想配列の例のように関数以外のコードに強く依存するようなコーディングは望まれないのではないでしょうか。

普通の変数の場合、hoge関数の引数が明確であるし、関数を使う側も引数を強制されるのでよいのではないでしょうか。

要するに、連想配列を使うメリットは無いと。

私の場合$birthday配列を使わなければならない場合でも、hoge関数の引数は$year, $month, $dayとするようにして、

if(isset($birthday['year'], $birthday['month'], $birthday['day'])){

$ret = hoge($birthday['year'], $birthday['month'], $birthday['day']);

}else{

//エラー

}

とかにします。

id:xxmasaxx

遅くなりましたが回答ありがとうございます。

確かに連想配列だと存在チェックなど色々面倒になりますね。参考になります。

2009/04/14 19:01:22
id:sphire No.3

sphire回答回数115ベストアンサー獲得回数122009/04/14 01:04:25

ポイント26pt

「連想配列」の方が、関数の仕様の拡張に柔軟に対応可能でしょうね。

年+月+日ではなく、年+月+第1月曜日、みたいな指定も可能にしたい場合

「通常の変数」タイプだと引数を増やすしかありません。

id:xxmasaxx

拡張性がしやすいというのが連想配列のメリットですね。

回答どうも有り難うございました。

2009/04/14 19:23:42

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません