2008/11/12

[javascript]引数の数が超多い時

たまーに人のソースを見ているとき、こんなファンクションに出くわすときがあります。


<input type="button" value="Run"
onclick="lf_test(1,'hoge','foo','',4.5)">
<script type="text/javascript">
function lf_test(a1,a2,a3,a4,a5){
alert(a1);
}
</script>

これ!!修正する度に、引数を追加しているっぽいんだけど、何十回も修正を加えていくと、そのうち、引数が膨大な数になってメンテナンスが大変になると思います。
そこで、この場合、引数を追加しなくても、下記でいけると思うのですが。。。

<input type="button" value="Run"
onclick="lf_test(1,'hoge','foo','',4.5)">
<script type="text/javascript">
function lf_test(){
alert(arguments[0]); //0~4までの数字
}
</script>

上にあとは、コメントをつけておけば、別に引数が何個増えようがおかいなしなので、OKみたいな。

3 件のコメント:

  1. うーん。修正後も正直あまり変わってない気がする……
    結局呼び出し側では引数5つ渡してるしね。

    そもそも、引数の数が5つを超えだす場合はほぼ間違いなくそのメソッドの設計が間違ってると思う。

    別オブジェクトにラッピングして渡すなり、別メソッドに分解するなりって作業が必要だねー。

    後、引数の多さをコメントでカバーしようとすると、後にソースを修正した時にコメントを修正し忘れて(大体の人がコメントは修正し忘れるんだよなー)結果的に余計恐ろしい事になる場合が多い……


    コメントかかないでもパッと分かるソースかけるように精進の日々です。

    返信削除
  2. >別オブジェクトにラッピングして渡すなり、
    >別メソッドに分解するなりって作業が必要だねー。

    具体的にこれってどういうことかな。
    ちょっと想像できないっす。

    返信削除
  3. まず、ラッピングに関して。
    JavaじゃなくてJavaScriptで書くと……
    多分JSONとかちゃんと使ってるから俺よりmaitoさんのが詳しそうだなw
    簡単な例で書くなら

    var person = {
    name:'佐藤',
    kanaName:'サトウ',
    sex:'male',
    age:'26'
    }

    こんな感じでラッピングオブジェクトを用意しておいて、渡すのはそれだけにする感じかな。

    function test(person){
    alert(person.name);
    alert(person.sex);
    (略
    }

    次にメソッドを分解するパターンだけど、この場合はメソッドがしたい処理の内容に依存するからサンプルでは書けないかな??

    返信削除