#261 無名関数の使いどころ理解してる?

2024/6/30 ·

  • この番組は駆け出しエンジニアの順平と中級エンジニアのノリ・カイチが送る駆け出しエンジニアを中級エンジニアにレベルアップさせるラジオでございますふぅ



  • 若本さんの真似してるのかと思った一瞬イケボウですねイケボウと呼んでくださいだっさイケボウだっさイケイケボウヤの略ですだよねそうですボーズじゃないですねボーイヤロンゲですということで今日はですねプログラミングをしてるとちょっと出てくる



  • シリーズ ちょっと出てくるシリーズ無名関数 ちょっと出てくるかもでもそんな頻繁に出てくるわけじゃないんですけど 見るときは見るよねみたいなざっくりお話しすると名前ついてない関数のことですね 無名関数名もなき子 親がいない



  • いるすべての人類には親がいるそう考えるとね一番最初は何だったんだろうってねまあまあまあいろんな宗教の話ありますから宗教なのかなアダムと言うのかみたいな無名関数名前がついてない関数のことを指しています



  • ちょっとこれ言語によって文法は違うので何とも言えないんですけどおそらく多くの人が触っているである触っておるであろうJavaScriptで言うと例えばそうだなセットタイムアウトとかの第一引数になんか



  • 引数になんかファンクション丸カッコ丸カッコ閉じ並カッコなんか処理並カッコ閉じみたいな関数を渡すケースがあると思うんですねあれってファンクションのキーワードの後ろに名前ついてないじゃないですか確かにあれが無名関数ですね最近だとアロー関数っていう形でもっと短く書けるよバージョンもあるんですけどただカッコのやつただカッコとえー



  • あれなんていう矢印みたいなやつ弓矢弓矢ですかあれ読み方いっぱいなイコール大なり僕あのプログラミング習った時あれロケットハッシュって言われてるって習ったんですけどそれ面白雑学ですねほんとかなみたいなあれがアローなんじゃないですか試しに聞いてみますねチャットGPにチャットGPにチャットGPに聞いてみて



  • えっと調べてもちょっとよくわかりませんでしたけどまあアローって言われてそうですねアローって言われてるんだちなみに他にもいくつかね聞いたことあるんですよファットアローなるほどねそのハイフンじゃなくてイコールだからねこれはちょっと聞いたか自分で言い始めたか忘れたんですけどダブルアローもなんか聞いたことあるなと思っててへーすご何その引き出し記号の読み方



  • それ面白いでもロケットハッシュが一番ウケるっすねロケットハッシュはマジで何だったんだろうハッシュってどっから来たんですかね確かにまあいいかまあそういうの使ったちょっと短いバージョンのアロー関数も無名で作ることができますねというか無名関数は短く書く方法かなアロー関数はどっちかっていうとそんな無名関数なんですけど使い時っていうのはやっぱりどんな文法にもありますよ



  • ということで今日は適切な無名関数の使い方というテーマでですね銀字でいこうかなと思います銀字するんですねあんま意識したことないな正直見たことあります使われてるのはただなんか僕は進んで使わない正直使いこなせてないっていう後ろめたさはある



  • ただなんか名前つけた方が俺はとにかく読みやすいって思ってしまっている確かにどんなに短い関数であれなんでそんなことしちゃうのってちょっと思ってるんですけど世間的に無名関数使った方がスマートだよねっていう空気感があるので何も言えないっていう今日ちょっとその辺勉強したいです



  • かしこまりましたJSとかでも結局変数によく入れてたりする気がするアロー関数はねその無名関数は入れないのかJSの場合変数に入れたら名前ついちゃうよねっていう感じだから代入される直前は確かに無名だったかもしれないけどあれ実質無名じゃない気がするということで無名関数



  • カイチが言ったさっきどんな短くても名前をつけちゃえばわかりやすいんじゃないかっていうのは穴勝ち間違ってはいないと思うあーはいはいはいギリギリこういう視点の人もいるよねぐらいの差し方をしたいそれ聞きたいこういう視点あるんだから聞きたいわかりましたよじゃあね今日は



  • JSでよく使われることが多いのでそのままJSで使うケースをイメージしていただけたらなと思っております無名関数一番よく使うシーン多分これじゃないかなっていうのはJSの配列



  • 配列型のデータに対してマップっていうメソッドを使うときがあると思うんですねでマップっていうのは引数に関数渡しますよねでそのときだいたい無名関数でやることが多いのかなと思ってるんですけどアロー関数渡したりとかしてちなみにマップの解説お願いしますはいでマップという関数はですねえーと



  • JSの場合は配列が持っているメソッドでございますこれはその配列の各要素に対して渡した関数の処理を行うみたいなことをしてくれていて例えばなんかどうしようかな順平の理解値っていうストリングが入った配列があってストリングが入った配列がありその後ろにかっこひまじんって



  • いう文字列を全部に付け足したいなっていう時はまず無名の関数を渡しますとで無名関数の引数にですね一個書くんですよ



  • 名前なんでもいいんですけどぶっちゃけこの無名関数の引数ってちょっと特殊でマップ関数が実は裏側でその関数を呼び出してくれてるんですよその時に要素の一個一個をですねそこの引数に渡してくれてるんですねなのでさっきの順平のりかえちゃったっけ順番はちょっと終わりですけどの配列を渡すとループ処理して1周目は順平っていう文字列がその引数に渡されて



  • 2周目のりっていう文字列が渡されて3周目開示っていう文字列が渡されてくるとそれに対してなんか処理するだから今回は後ろにかっこひまじんをつけたいので文字列連結JavaScriptだとプラスを使うと思うので渡されてきた引数プラス文字列でひまじんかっこひまじんっていう文字を渡してリターンしてあげるとそうすると一個一個の



  • 要素に対して同じ処理を繰り返してその処理結果の新しい配列を作ってくれるっていうこれがねマップという



  • 感想でございますめっちゃ簡単に言うと4-1びっくりしました僕は当初マップを知った時勝手に4-1みたいなことしてくれるんだって便利って思った記憶ありますその通りですこれ僕なんでしょうプログラミング始めたてからマップってこういうもんだって思ってるんですけどマップってなんでマップって言うんですかね確かに



  • 現在マップの命名の由来を検索中でございます数学におけるマッピングは写像とかこっちで言うこれと逆側のここと紐付けて写像って意味あるの?写像じゃない?絶対だから写像っていう意味合いのマッピングなんだっていうのはちょっとしっくりきます写像ってあれですよね写すみたいなそうですはいなんで関数を通してだから



  • ノリをノリかっこひまわプロに写像してるんですよねそうだねあれマップ処理は実はニューノリを生成してますねはいはい関数適用語のそうですよねっていう意味でなんかその関数というものを使って写像させてるっていう意味なんだっていうのはちょっとしっくりくるなるほどね確かにうんうん



  • それだわ絶対それっぽいですよねあと数学好きですねプログラミングしてた人まあまあまあ言ってしまえば数学ですからプログラミングはためになったわなるほどなはいということでマップの由来が分かったところではいすいません脱線してマップというのは渡した関数を使って新たな配列を写像するというむずくなってない?なんか最初の説明より確かにねすごいはい



  • ふり押しましたというのができますよとでその時によく無名関数が使われてるよということなんですけど無名関数の使い時ですよはいいつ何台とこれはですね2つ条件があります条件まずはその関数の処理が自明な処理であること自明どういうことですかもう



  • 何してるか明らかにすぐ分かる誰が見てもこれやろうっていう処理をしてるそうです例えば足し算とかマジでただ足して返してるだけとか引いて返してるだけとかそういう計算を繰り返すとか文字をマジで連結させてるだけとか明らかに自明な処理に関しては



  • 無名関数使うチャンスポイントその1ですねこれ使う欲がちょっと上がるそしてその2そのロジックを繰り返し使わないことなるほど



  • 名前ついてないので次呼ぶとき呼べないんですよなのでその同じロジックが何回もいろんなところで出てくる場合は無名にしてしまうと毎回同じロジックを新しく書かなきゃいけないのでこれはもう重大なドライ違反になりますね懲役10年そんな重いドライってそんな重いんだ重いですねこれは人殺すより重いですよ重いですじゃあ



  • めっちゃ自明なこれやってるやろっていう処理だけど何回も呼び出すってなったら運命関数を変数にぶち込んでその変数を使います場合による場合による気がするでもぶっちゃけさ例えば足し算とかですよとってなった時に足し算ってあまりにも一般的なことすぎて関数を呼ぼうが足し算を書こうが



  • そのロジックが後々変更されることがなさすぎてどっちでもいい気がする多分どっちでもいいっていうケースもある気がするじゃあもうコード書いた人とそれをレビューした人の中の空気感それはあるかもなでもドメインに関することであれば名前付きの関数に分けた方がいいんじゃないかなって気がするね5%消費税かかるみたいなそうそうそうそう



  • なぜなら足し算っていうのはもう世の中にあまりにも汎用的にありすぎて絶対に変わらないことだと思うんですけどドメインのロジックっていうのはビジネスが変わったら変わり得るのでその時にもう無名関数が100個ありましたって100箇所直さなきゃいけませんはしんどすぎるのでドメインに関係するかどうかは大事な気がするなそれを判断するためにはいろんな知識が要りますねやっぱりね



  • ドメインのか否かみたいなものもそうですしこれって自明なのかとかいまだになんですけど僕ドメインっていうのがいまだにあんまりしっくりこなくていろんな言葉同じ言葉で言ってますよね多分広く言うと物事の概念の一区画みたいなイメージめっちゃ広く言うとただそのURLのドメインもあるしえー



  • 業種とかそういうドメインっていうのもあるし確かにね情報システムにおけるリソースとしてのドメインみたいな言い方もあるしそれはこんがらがるかもしれないね確かに今回の文脈でいうドメインは要はビジネスロジックと呼ばれてるやつでアプリケーションがなくてもそれはやるよねっていうやつ例えばECサイトで有料会員の方は



  • 10%オフですよみたいなそれは別に実店舗であろうがアプリケーションであろうが有料会員は10%オフっていうのはビジネスロジックじゃないですかうんうん



  • 一方アプリケーションのロジックっていうのもあってそれは例えばユーザーが登録したらデータベースに保存するとかこれってお店だともしかしたら紙に書いたりとかしてるのかもしれないですけどデータベースに登録するっていうのは要はアプリケーションの都合の話ですよねそういうロジックはアプリケーションロジックっていう感じでロジックは大体その2つに分けるかなっていううん



  • そのアプリケーションロジックもドメインに含まれる含まれないロジックっていう大きなものがあってその中にドメインに関するロジックとアプリケーションに関するロジックがあるかなっていう分類に思えるOKです理解です今回で言うとそういうドメインに関わらないものだったら無名関数でもいいよね



  • かつその処理が自明であることっていうのは大事ですねはいはいはい一方自明ってすごいふわっとした言葉なんですけどそもそも自明じゃない処理とはどういうものなのかとそこ気になるですね要はこのケースでは無名関数使うなケースなんですけどまず行数多い場合は自明じゃないことが多いまあ確かにだってパッと見でさ読めないんだもん



  • この場合は名前付き関数を使ってあげるのが圧倒的にいいですねなぜなら名前付きの関数はその長い処理に対して1個の中小的な名前を付けてくれるので要はサマってくれてますサマライズまとめてくれてるのでそういう風な名前付けることにいい価値があるので行数が多い処理に関しては無名関数では書かない方がいい個人的には3行が限界かなと思ってますうんうんうん



  • 2行は何か処理して何かリターンするみたいなのがあり得るかなと思ってるんですけど3行以上書く場合はちょっと名前ついた方が良いのかなっていう気がなんとなくしてますねただ行数はあくまで今パッて言っただけなんで3行以上でもまあ自明であればいいのかなとは思いますまあそういうのがあればってことですねはいその2



  • 行数は短いけど何をやってるかわからないやつあるあるっていうのもありますこの場合も名前つけたほうがいいですね例えば渡された値を2倍にするっていう処理を書きたいとっていった場合に自明なパターン×2して返す自明じゃないパターン実はその数値がバイナリだったので左に1個シフトして2倍にするうんうんうん



  • 2進数の話ですね2進数は左に1個シフトすると2倍になる要は10って1個左にシフトしたら100になるじゃないですかこれって10進数だから10倍になるんですけど2進数の場合は2倍になるんですようんうんうんうん



  • っていう処理をしてる場合自明じゃない気がするなぜならビット演算のシフトはあんまりこうどうなんだろうコンピューターサイエンス学んできてないエンジニアが多い日本人にとってはあんまり自明じゃない気がする僕は自明じゃないので名前つけます名前つけます?はいそうダブル関数名ダブルわかんないけどうん



  • なるほどこれは一行で書けるけど自明じゃないパターンに当てはまるかなといやーすごいいやーむずいなむずいそれなんかその読んでたらなんだってなるんですけど書いてるとなんないんですよね伝わりますかわかるわかるわかるわ



  • 文脈ありきで自分は書いてるからそりゃそうやろって思うんですけど他人が見ると急に出てきたみたいに見えるあるななんかさすごい頑張って配列の値を操作する処理とかさそうなりがちだよねそうそうそうそう無影関節使うときも多分何かしらのデータ操作するときが多いと思っててしかもあのちょろっとした加工ですよねだからちょろっとした加工を



  • 自明かどうかってやっぱ本当に何でしょうレビュー力というか自分考え魅力必要ですね確かにライブラリーとか言語の機能を一発ポンって使ってるだけだったら結構簡単な可能性は高いけどたださっき言ったビットのシフトも



  • 言語の機能の部分をただ一発使っただけではあるから確かにむずいなそうそうそうちょっとそこは明確にはできないんですけどレビューの時になんかんって思われたらレビューしてる人はちゃんとそれを言ってあげるべきだしそのレビューをくらった人はこの辺がさじ加減なんだみたいなのを学んでいくべきなのかなうんうんうんうん



  • エンジニア歴によってパッと見分かるとか分かんないのとは違いますしねだからチームのレベル感っていうのも絶対大事だと思いますねここのチームならこれ使えるけどこのチームなら使えないっていうのはめっちゃあると思う駆け出し1人いたら今のは名前つける駆け出しに合わせるかもね非常に難しいところなんですよねそうね確かに100人いて駆け出し1人だとまた話が違ってくるというか確かに



  • どうなんでしょう僕4人4,5人で駆け出し1人でも駆け出しに合わせるかは考えます考えるというかそうかって思います3人なら悩むか駆け出し3人違う3人に対して駆け出し1人ああそういうことかそれは確かにそうですね2人だったら合わせますけどそうね3人は迷うって感じですね駆け出し率30%だと駆け出し率30%迷うね



  • 指標が教育のためのプロジェクトですもんもはやそれ多分なるほどまあというので業数短くても難しい処理というか理解しにくい処理っていうのはあるのでそういう場合もあんまり無名関数は向いてないですよと



  • あとはさっきの裏返しですけど処理を繰り返し使う場合ですねドメインに関するところの処理で繰り返し使いそうなものは名前を付けてあげないと処理がいろんなところに散らばってしまうので修正の時大変になりますよという現象が起きる懲役10年ですねそれが一方で無名関数を使うとどういうメリットがあるのというところなんですけどこれは小さいがっかりを減らすために使っているだけなんじゃないかなとは思います小さいがっかり



  • はい例えば無名関数渡されてました間違えた関数渡されてましたこれは無名じゃなくてちゃんと名前付きで渡されてますとそこに飛んでって例えばなんか文字足す処理だとしてでジャンプしましたと本当にそれだけでしたとはい



  • そのジャンプしたのがなんかもったいない気持ちになるというかっていうなんかプチがっかりをなくすために使ってるんじゃないかなっていう気がしますわざわざ見に来させんなやっていう話かそうでなんかアドだからまあ足し算だろうなと思いつつも見ないとなんかやっぱ不安じゃないですかなんかしてるかもみたいな見ますね



  • ってなったらジャンプの手間を考えたら別にここに一行ねじ込むぐらい楽なんじゃないかなっていう発想ですね腑に落ちたそういうことかっていうのが無名関数でやるモチベーションなのかなと思いますねうんうんうん行ったり来たりしなくて済むので全体のコード読むときに楽になるかなといううんうんうん小さいですね小さなストレスをそうそうそうそう



  • なるほどなじゃあこれ書いてみてこれ外に関数出したらがっかりされるかなってのを考えることですねなんか小魅力ですね本当にそれもねエンジニアはマジで小魅力超大事だよね誰が見てんのかとかもそうだけどさ



  • 実際プロダクトを作ってる時って使ってるユーザーもいるわけでそのユーザーのことも考えなきゃいけないしユーザーだけじゃなくて運用してる人とかトラブった時に見るちょっと詳しい人のことを考えるとか確かにログ残す時とかもさこのエラーが出た時はこのログが出てたら助かるかなみたいな予想で書いたりとかね未来の自分もしくは知らない人に向けて



  • そうなのでそういうさじ加減のギリギリを攻めているのが無名関数かなって思ってますね確かにそれはなんか今というかこの話を聞いて僕も前その無名関数のなんか説明されているようなところを読んでいるのかなって思ってたところとはあったんですけど思ってたんですけど確かにその痒いところに手を届かせるためのというか



  • なくても困らないけどあったらちょっと便利な時があるぐらいのやつな気がするしかも便利っていうかがっかりをちょっと減らせるちょっとがっかり減らせるなぁとあー確かに気遣いなんだ無名関節をうまく使える人はそういう気遣いができるってことなんですかねそうだね小魅力高い逆に逆回しっかりですけどね表なし力茶道みたいなもんだよね茶道みたいなもん茶立ててみたいなそういうの出てきて



  • 無名関数は作動の道具作動のための道具だからコーディングって本当に昔は動かすために書いてましたけど最近はチームメンバーとか将来の自分このコードを完全に忘れた後の自分に向けた手紙みたいなノリで思いやり駆動開発思いやりを込めて



  • 単性に作るっていううんうんなんか楽しみが増えてますねやっぱ分かる数年は結局それ考えるのってなんか楽しいよね楽しいうんエキサイティングあとなんかだからそれにしょうもないところで迷ったりするんですけどねそうねいやこれはどっちでもいいかってなったりするんですけど分かるえーいいなうん必死必死こなすのに必死今



  • 全然ひしまだもうそろそろ思いやりできてくる一回被弾すると思いやる思いやろうって思えると思うわでも順平の仕事の仕方的にそれがあるか分かんないけど1年とか2年前に書いた自分のコード見ていやなんだこれ全然分からんってなると思いやろうってなると思うセルフ被弾は確かに結構学びになるよねセルフ被弾大事ないよね現場変わると多分ないんだよね



  • セルフじゃないと言いにしろ誰かの誰かの被弾はあるかもしれないねでもねでも誰かの被弾よりもセルフ被弾の方が学びはあるかもしれない自分のせいだから成長を感じるポイントでもありますからねまあそうですねそれは確かにはいちょっとまあまあいったんでいいんですかねこれでまあまあいったんだ無名関数盛り上げありがとうございます10分くらいで終わると思ってちゃったんですけどいやいやいや



  • でもちょっと一つスッキリしたんで僕は満足です面白かったですありがとうございますでは締めますねハッシュタグひまじんプログラマーでSNSのXでフィードバック募集してますので無名関数ですか何でしょうね無名関数とコールバックごっちゃになってるよっていう人は出てくださいシンプルにアローのこんな呼び方あるよ選手権アローの呼び方あるよ選手権大喜利じゃん



  • アローの呼び方を募集してますロケットハッシュ好きですけどねロケットが横向きにねそういうことがある見た目がロケットっぽいからかでもハッシュはなんだろうねっていうのを募集してますのでお願いしますあとはポッドキャスト説明欄からグーグルフォームで番組のお便り要望質問感想何でも募集してますお気軽に感想でもお願いしますお願いしますお願いします



  • あとポッドキャストプラットフォームのフォロー高評価もお待ちしてますのでお願いします最近ちょっとお便り少なくなってきてる気がするので欲しいですね確かに本当だお便りの話ししちゃって今ではありがとうございましたまた次回バイバイ



  • 小さな海を泳ごう今プロノリーを響け出しから共に成長してゆけ金プロダマーと未来へ昨日のラジオ響けよ駆け出し顔に成長してゆけ今ジンプロダマーと未来へ

0:00 28:40

#261 無名関数の使いどころ理解してる?