JavaScriptのメソッド定義する時に引数どうしようか悩んだ話
ライブラリを作成しようとしている人の参考になれば。。。
案1: 1オブジェクトにまとめてしまう
paramsで渡された内容を元に、HTTPリクエストを行うメソッドの例
sendRequest(params) //url, method, headerなどが全部入り
.then((res)=>{})
.catch((err)=>{});
- メリット
- メソッド呼び出しもとは、すっきり書ける
- 仕様が変わっても、呼び出しもとを変更をせずに済むかも
- デメリット
- sendRequestの必須パラメータがすぐ分からない
- パラメータが設定されているかメソッド内で調べるのが大変
案2: 全パラメータをそれぞれ引数にしてしまう
案1と同じく、引数をもとにHTTPリクエストを行うメソッドの例
sendRequest(url = "", method = "GET", header = {}, query = {}, body = {})
.then((res)=>{})
.catch((err)=>{});
- メリット
- 必要なパラメータが一目瞭然
-
デフォルトパラメーターを設定しやすい
- nullチェックなどが楽になる
- デメリット
- 省略可能なパラメーターもちゃんとnullとかを設定しないといけない
- 上の例だと、GETメソッドでリクエストするのにbodyパラメータも必要になるという感じ
- 省略可能なパラメーターもちゃんとnullとかを設定しないといけない
案3: (たぶんベストプラクティス)必須パラメータ + オプションのオブジェクト
sendRequest(url, method, opts = {}) //optsにheader, query, bodyを入れる
.then((res)=>{})
.catch((err)=>{});
- メリット
- 案2よりすっきり呼び出せる
- オプションパラメータは全部or一部を省略できる
- ここでもデフォルトパラメータを使うとちょっと楽になれる
- 案2よりすっきり呼び出せる
- デメリット
- オプションパラメーターの存在確認とかが必要
その他
- 悩んでいる途中に以下の記事にたどり着いて解決した
- Best practices for JavaScript function parameters | CodeUtopia
- bookshelf.jsとかが実はそうなってたのにも後から気づいた