メソッドチェーンについて勉強してみる

はいどーもこんにちは、自分を無職だと思っている無職です。
本日はメソッドチェーンについて勉強してみますよ。
言語はJavaScriptときどきC#です。

メソッドチェーンってなんやねん

メソッドチェーンとは「メソッドの戻り値が持っているメソッドを呼び出す」ことを続ける書き方です。
つまりメソッドをチェーンのように繋げていくのですね。

具体例を見たほうがわかりやすいと思います。
まずはJavaScriptのコードをどうぞ。

arrayは0から9までの値を持つ配列です。
その後、arrayに対してfilterメソッドを実行しています(C#と合わせるためにアロー関数を使用しています。ツクラーの方にはあんまり馴染みないかも。この記事の最後に従来の無名関数で書いたバージョンも載せていますので、必要なら参照してください)。
その後、filterの結果(配列です)に対してさらにfilterを呼んでいますね。
これがメソッドチェーンです。
このチェーンに対し、さらにmapメソッドを呼んでいます。
最終的に返される結果は12と16ですが、各動作をもう少し詳しく見てみましょう。

まずは最初のfilterを見てください。
これはarray配列から偶数だけを取り出しています。
この時点で配列の中身は偶数だけになりました。

さらに次のfilterをご覧ください。
これは5より大きい数字だけを取り出しています。
この時点で配列の中身は6と8だけになります。

この6と8だけを要素に持つ配列に対し、mapメソッドを用いて各要素を二倍にした新しい配列を作成(射影)しています。
あとは結果をfor-ofループで回しているだけですね。

C#でなら、これをLINQでやりたいと思うかもしれません。

少し変わっているのは最初の配列の作成方法だけですね。
Whereがfilterと似た動作をし、Selectがmapと似た動作をすると理解できれば特に難しいところはないと思います。

注意点

さてここで一つ注意しておきたいことがあります。
JavaScriptのfilterメソッドやmapメソッドは配列の実態を生成します(即時実行)。
つまり、メソッドチェーンを増やすごとにメモリの消費も増えます。

これに対し、C#のLINQは必要になるまで実態を生成しません(遅延実行)。
つまり、いくつメソッドチェーンを増やそうがメモリの消費は(ほぼ)変わりません。

この違いが重要になるのは、巨大な配列を扱う場合でしょう。
メソッドチェーンは直感的に書けて大変わかりやすいものですが、JavaScriptでの多用は避けた方がよいのかなーと思いました。

注*実際にメモリ消費を計算したわけじゃないので、増えてなかったらゴメンチャイ!

終わりに

メソッドチェーンの書き方(ドットの位置をどこにするかなど)は人によって結構変わるみたいですね。
僕も当初は色々と考えていたのですが、もうめんどくさいのでIDEの補完に任せましたw

最後に、通常の無名関数でメソッドチェーンを書き直したバージョンを載せておきます。

ご覧の通り、ものすごく読みにくいです。
アロー関数が使える環境ならアロー関数を選ばない理由はありませんね。

ほなそんな感じでまた。

フォローする