Part34: ビルダー

ことり「今日は2016年6月30日」
凛「ということは!」
ことり「そう、ラブライブ!6周年の日です♪」
凛「んー、思い返せば懐かしいことばかりにゃ」
ことり「『彼氏いない歴17年よ』とか、『歌もダンスもやったことないけど』とか」
凛「ことりちゃん、黒歴史を掘り返すのはやめるにゃ!」


ことり「今日はビルダーという考え方を見てみます。Groovyなんかだとおなじみのテクニックだね」
凛「Groovyと言われてもさっぱりにゃ」
ことり「AltJavaの一種でそういうのがあってね・・・まあ、Groovy知らなくても大丈夫だよ」

凛「・・・何これ」
ことり「これは簡単なHTMLを生成するビルダー。ちゃんとしたKotlinのコードなんだよ」
凛「わけがわからないにゃ」

ことり「最初の行でインポートしてるパッケージの中身はこうなっています」

ことり「HTMLとかHeadとか、HTMLのタグに応じたクラスが定義されてるの」
凛「うーん、こっちはKotlinのコードに見えるにゃ」

ことり「最初のビルダーに戻って、なんでこんな書き方ができるのか見てみましょう」
凛「うん。何をやってるのかはなんとなく分かるけど、なんでこう書けるのかが意味不明にゃ」
ことり「まず、html {...}ってところからね。これは、引数にラムダ式を取る関数なの」
凛「はっ、そういえばそんなのもあったにゃ」
ことり「実装はこうなっています」

ことり「initが受け取ったラムダ式。型を見るとHTML.() -> Unitになってるけど、このHTMLはレシーバです」
凛「・・・レシーバ・・・」
ことり「凛ちゃん、ついてきてる?」
凛「・・・どうぞお気遣いなく」
ことり「まったくもう・・・この場合、関数をHTMLクラスのインスタンスに対して呼び出してあげると、それをthisとして関数内で参照できるんです」

ことり「headとかbodyHTMLのメンバ関数だから、こうやって呼び出せます。このthisは省略もできるから」

ことり「こう書けるね」
凛「なんとなく最初のコードに近付いてきたにゃ」
ことり「ここから先、headbodyの処理はhtmlとほとんど同じです。ラムダ式を受け取って、それを評価して、違うのは子要素としてコレクションに追加してあげることくらい」

ことり「headbodyでやることは同じだから、initTag関数で共通化しちゃってます」
凛「にゃーん」
ことり「あ、まずいかな」

ことり「最後にテキストノードの追加について」

ことり「<title>XML encoding with Kotlin</title>を生成するのに、こんなコードを使いました」
凛「この+"hogehoge"っていうのも見慣れないにゃ」
ことり「それはね、演算子オーバーロード」
凛「にゃーん」
ことり「もうちょっとだよ!がんばって!」
凛「はうぅ」

ことり「演算子オーバーロードの回で出てきた表にあるように、unaryPlus関数は前置+に対応してます。文字列に前置+をつけたら、テキストを子要素として追加してるの」
凛「かろうじてわかった気がするにゃ」
ことり「ここまでで説明したことを組み合わせると、サンプルコードが組み上がるようになってます」


凛「にゃーん」
ことり「エンジニアがそれ言い出すと本格的に追い詰められてるって聞いたけど・・・」
凛「わかった気はするけど自分で書ける気がしないにゃ!」
ことり「今までに出てきたいろんな考え方の組合せだから・・・ちゃんと復習しながら改めて見直せば、理解が進むんじゃないかな」
凛「うぅ、頑張るにゃ・・・」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です