1. ホーム
  2. javascript

[解決済み] 複数引数 vs. オプションオブジェクト

2022-04-16 23:15:27

質問

複数の引数を持つJavaScriptの関数を作るとき、私はいつもこの選択に直面します。

例えば、nodeListを配列にマップする関数を書いています。

function map(nodeList, callback, thisObject, fromIndex, toIndex){
    ...
}

代わりにこれを使うこともできる。

function map(options){
    ...
}

ここで、options はオブジェクトです。

options={
    nodeList:...,
    callback:...,
    thisObject:...,
    fromIndex:...,
    toIndex:...
}

どちらが推奨される方法なのでしょうか?また、どのような場合に一方を使うか、もう一方を使うかのガイドラインはありますか?

[私の場合、引数のリストを使いたくなった理由のひとつは、JavaScriptに組み込まれているarray.mapメソッドと一致する動作をさせるためでした。

解決方法は?

他の多くの人と同じように、私もよく options object を関数に渡すのは、長いパラメータのリストを渡す代わりに、正確なコンテキストに依存します。

私はコードの読みやすさをリトマス試験紙として使っています。

例えば、こんな関数の呼び出しがあったとします。

checkStringLength(inputStr, 10);

このままでもかなり読みやすいコードだと思いますし、個別のパラメータを渡すのも丁度良いですね。

一方、このように呼び出しがある関数もあります。

initiateTransferProtocol("http", false, 150, 90, null, true, 18);

ある程度調べないと全く読めません。 一方、このコードはよく読めます。

initiateTransferProtocol({
  "protocol": "http",
  "sync":      false,
  "delayBetweenRetries": 150,
  "randomVarianceBetweenRetries": 90,
  "retryCallback": null,
  "log": true,
  "maxRetries": 18
 });

科学というより芸術ですが、経験則を挙げるとすれば。

以下の場合、オプションパラメータを使用します。

  • パラメータが4つ以上ある場合
  • パラメータのいずれかがオプションである
  • どのようなパラメータを取るのか、関数を調べる必要があったことがある方
  • もし、誰かが "ARRRRG!" と叫びながらあなたの首を絞めようとしたら。