オブジェクト引数とは
関数の引数としてオブジェクトを渡すパターンのことです。
例えば、下記のような関数を作るとき①のように書くことも出来ますが、②のように書くことも出来ます。
function findUserByName({ name, nationality }): User {
// ...
}
function findUserByName(name, nationality): User {
// ...
}
①のように書くと、関数を呼び出す時にキーを指定することになるので明示的に書けます。
findUserByName(
{
name:"佐藤"
nationality:"日本"
}
)
②のように書くと、スッキリ書けます。
findUserByName("佐藤","日本")
さて、どちらの書き方をすべきでしょうか?
RORO (Receive an Object, Return an Object)
筆者はオブジェクト引数と言っていますが、このようなパターンはROROと呼ばれています。
※ROROは「オブジェクトで受けとてってオブジェクトで返す」考え方なので、この記事で取り上げているのは厳密には「RORO」ではなく「RO」ですね・・・
結論
引数が2つ以下の場合、通常の引数として受け取る。
引数が3つ以上の場合、オブジェクト引数にする。
理由
引数が2つ以下の場合に、オブジェクト引数を使うのは冗長なので可読性が落ちる。
逆に3つ以上の場合は、プロパティによって明示的になっている方が、可読性が高い。
また、オプショナルな引数が扱いやすくなる。
例えば、第二引数、第三引数がオプショナルな場合に第二引数は省略したい。といった場合にundefinedを挟まなくてはいけなくなってしまったりする。
findUserByName("佐藤",undefined,27);
おわりに
他にも理由はありますが、基本的には引数の数で単純に考えるのが良いかと思います。
もし、この考え方で違和感が出てくるシチュエーションが発生したらその時考えましょう。