テンプレートを自分で作ってみた

kiuchi氏:お酒を飲んでいいって言われたので、プレモルを1本空けてほろ酔い状態で、「何話すんだっけ?」って、今すごく頭が真っ白の状態ですね。がんばって話していきたいと思います。

一応、Androidエンジニア兼、育児パパしてます。先日、娘が1歳になって、めっちゃかわいいです。いい反応ですね、そういうのを待ってました。

Twitterとかはこんな感じでちょいちょいやってます。さっき「ほろ酔いでどうしよう」っていうつぶやきをしました(笑)。

最近のアクティビティは、「DroidKaigi2018で発表してきました!」っていうことをちょっとがんばって強調してみました。

今まで発表した2人とも発表してたので、「あれ、これはあんまり目立たないぞ?」ということになって、「どうしよう」って、今ちょっとテンパってます。一応、YouTubeに上がってるので、見てくれたら僕の再生数が増えて、ちょっとハッピーな気分になります。

これで何をやってたかっていうと、今回のテーマである、テンプレートを作ってみました。「何のテンプレートなの?」というと、KotlinでCleanArchitectureの実装を簡単に作れるテンプレートです。これを使ったら、だいたい15分ぐらいかかっていた作業が1分以下ぐらいで終わるようになったので、「ヒャッホーウ!」って、うれしい感じになりました。

一応サポートしている主なライブラリとかですが、主要なところはだいたい個人的に使ってるので、抑えられてるかなぁと思います。

ちなみに、(スライドを指して)一番下に書いてあるDataBindingとViewModelは、今週でがんばって対応しました。まぁ、ずっと放置してただけなんですけどね。

ViewModelは今日プッシュしました。疲れました。Daggerのインジェクションが全然解決しなくて死にそうでしたね。みなさんに使っていただけたらいいなと、一応、(スライドの)一番下の隅っこですがURLを載せてます。

この発表をDroidKaigiでしたんですよ。そしたら、「テンプレートってどうやって作るの?」って、1つ疑問が出てきました。まぁ、その時は確かに話してなかったな、と思いました。じゃあ、やっぱりテンプレートをちょっとのぞいてみようということで、今回この場に立たせていただきました。

ただ、DroidKaigiを聞いていただけた方はいいかもしれないですが、テンプレートをのぞく前に「じゃあそもそも、テンプレートが作れると何がうれしいんだっけ?」というところから話していかないといけないと思います。

テンプレートを作ってうれしかった3つのこと

個人的に僕がテンプレートを作ってうれしかったことを、3つ挙げようと思います。まず、新しい画面とかを作る時のひな型を自分好みに作れます。今、Android Studioを使っていただいてる方がほとんどだと思うんですけど、テンプレートがあると思います。ただ、やっぱり自分好みじゃない時って多々ありますよね。

例えば、ログインのテンプレートがあるんですけど、「やっぱり作りたい画面とちょっと違うんだよね」とか。ベースアクティビティとかあるけど、「やっぱりちょっと違うよね」っていうことがある。それを自分たちの好みでカスタマイズできるというところがすごく強いと思います。

2つ目は、まさに今回のCleanArchitectureの場合もそうなんですけど、アーキテクチャとかを採用する際のひな型が作れることです。これを作るとどうなるかというと、例えばプロジェクト内で「オレオレ実装」を減らせる。「みんな、このテンプレートを使ってね」とテンプレートをインポートしていただいて、それをベースに作ってもらえると、個人のゆらぎっていうものが減るかなと思います。

あと、定型文で実装するっていうところを自動で作れます。よくあるのが、Daggerのモジュールのところや、コンポーネントのところの実装ですね。慣れてないとインジェクション周りで死ぬことになって、「なんで解決しないんだ!」ってなると思うんですけど、一発でも成功しちゃえば、それをテンプレートとして使い回せるので、楽ちんというところがあります。

3つ目は、アペンド的なものなんですけど、新規プロジェクトを作る時とかのDependencyです。「俺、何のライブラリ使ってたんだっけ?」という時に、さっきバーッと挙がってましたけど、これ全部をパッと書ける人って、けっこういないと思うんですね。

前に使ってたプロジェクトからコピペしてくるのが主だと思うんですけど、「最新のバージョンっていくつだっけ?」「今作ってるのって、なにを使ってるんだっけ?」という話になってくるんですよね。そういうところから解放されます。「いつも使ってるやつは、もうこれ一発でいけるぜ」っていうことができるんですね。ちょっと使いたくなってきてくれるとうれしいです。

template.xmlはテンプレート作成に必要なパラメータを設定

では、改めてテンプレートっていうものの中身を見ていきたいと思います。その前に、「そもそもテンプレートってなんだ?」ということですが、これです。

おそらく見たことがあると思います。「New」って(メニューを)選択した時に、この「Activity」っていうところにある「Empty Activity」や「Basic Activity」とかが、いわゆるテンプレートと言われるものです。

「じゃあ、それはどこにあるんだ?」ということですが、MacとWindowsではちょっと場所が違います。だいたいそのプラグインのAndroidのlib/templates/activities以下にあります。みなさんたぶんMacの中にAndroid Studioが入ってると思いますので、手元のやつをピッピッピッと見てもらえるとわかります。フォルダがズラーッと並んでいます。

この下にあるのがテンプレートです。ここにファイルを置くことで、先ほどの画面のtemplatesというところにズラーッと出てくるようになります。

「ファイル構成はどんな感じ?」ということですが、ここではBasic Activityがあるので、それをちょっと参考に、ファイル構成というものを見ていこうかなと思います。

基本的には、だいたいこのディレクトリ構成がほとんどです。

黄色(の文字)にしているところが今回お話しするところです。他のところはだいたい共通なので、あんまり説明しなくてもいいかなと思ってます。

重要なのは、この(黄色い字にしている)「recipe.xml.ftl」「template.xml」、あとその他、rootフォルダの下にある、諸々のなんとか系、「なんとかこうとか.kt.ftl」っていうファイルたちです。これらが基本的に最低限のテンプレートを構成するために必要なファイルです。厳密にはもうちょっといるんですけど、基本的にはこの3つです。

わかりやすいところから順番に見ていきます。自分で作る場合は、template.xmlを一番最初に見たほうがいいと思います。

これは何かというと、みなさんテンプレートで作る時、この画面をよく見たことがあると思います。

左側に画像が書いてあって、右側にパラメータを入力するような画面です。ここのパラメータを設定するのがtemplate.xmlの役割です。

中身を見てもらえればわかるんですけど、id、name、type、constraints、suggest、defaultとか、だいたい読めばわかるようなパラメータがゴロゴロ書けます。

ここに書くことによって、すべてのテンプレートで使うパラメータを設定できます。例えば、(スライドを指して)ここで「MainActivity」と書いてますが、このMainActivityというStringは、この「Activity Class」というIDでアクセスすることによって、取ってこれるようになります。これを使うことによって、各自動で生成するアクティビティの名前を作ったりするわけですね。

ざっくりと話すと、(template.xmlは)テンプレート全体で使えるパラメータを設定します。パラメータとして、主にStringとBooleanとEnumが使えます。画像も設定できます。このパラメータを元にrecipe.xml.ftlというファイルを実行することになります。

recipe.xml.ftlはファイル・フォルダ作成のあれこれを設定

では、「このrecipe.xml.ftlファイルって何?」というところです。これは「ftl」っていう拡張子で、FreeMakerという言語です。

すごくわかりづらくて、個人的にはよくわからないんですけど、元々がXMLなのでXMLにif文とかも追加できるみたいな、僕はそのくらいの認識です。たぶんもうちょっと詳しい人が話せば違うと思うんですけど。

このrecipe.xmlで何をしてるかというと、ファイルの作成やオープンとかをやっています。マージもやってます。フォルダの生成もやっています。(スライドを)見てもらえばわかるんですけど、一番上のinstantiateというところで、ファイルの生成ですね。fromとtoで、fromのところに元ベースとなるテンプレートで、toでここに吐き出すっていうことを指定しています。こういうものがズラッと並んでます。

あとはフォルダも作れます。「mkdir」(make directoryの略)と書けば、好きなフォルダを作れます。(スライドを指して)ここでは例えば、src/main/kotlinにKotlinのフォルダを作りたいっていうことを指定しています。

それと、AndroidManifestファイルとGradleのファイルに関してのみ、マージということができます。ただ、これは挙動がおかしい時が多々あるので、極力使わないほうがいいと思います。最低限ですね。一応、マージということができるので、例えば既存のAndroidManifestに対して、新しくアクティビティを作る際に、その定義をぶっ込むということがこれでできるようになります。

最後はDependencyですね。これはGradleに書かれるインプリメンテーションを書けるようになります。(スライドを指して)ここではDaggerで書いてますけれども、こういう感じで書いたりすることができます。だいたいここのルールにしたがってテンプレートを実際のプロジェクトにぶち込むということを制御しています。

ざっくりまとめると、(recipe.xml.ftlは)FreeMakerで書かれてます。

一応、URLはこれです。「FreeMaker」で検索してもらえれば出てくると思います。ファイルの生成、マージ、オープンを行えます。フォルダの生成もできます。Dependencyの設定もできます。だいたいここで制御します。

rootフォルダ以下のkt.ftlはひな型を配置する

一番最後、「Activity.kt.ftl」です。これが最終的に出力したいアクティビティの中身です。ほとんどアクティビティそのままなんですけど、注目してほしいのは、「$」から始まる黄色(の文字)のところです。

template.xmlで指定したパラメータとかを、ここで参照できます。

黄色(文字)で書いてる「activityClass」というところで、さっき指定したパラメータのアクティビティ名をここで参照します。なので、これを出力すると、「class、main、activity、コロンなんとかこうとか」みたいなかたちで、ここで作成されるという流れです。

あと、ftlはFreeMakerの言語なので、if文とかも条件式で使えます。なので、例えば、「Retrofitを使う場合はRetrofitのインポートを書きたい」ということができたりします。

ということで、これらを使うことでファイルを使います。「Activity.kt.ftl」のルールとしては、だいたいroot以下にフォルダを作成して、ひな型のあるファイルたちを配置します。一応、ディレクトリ構成としては、たぶん基本的にはsrcの下にクラス系のファイル、resファイルにリソース系のファイル、root直下にはAndroidManifest系とbuild.gradleのファイルを配置するという、大まかなルールで配置してると思います。

これじゃないといけないというわけではないんですけど、他のテンプレートを見る限り、だいたいそんな感じになってるので、それに倣っておこうかなぐらいのノリです。

だいたい全体の流れはこんな感じですね。一応、まとめです。

テンプレートを自作できると何がうれしいかというと、複数のクラスを同時に作成したり、アーキテクチャに則ったクラス設計を一発で簡単にできたりということができます。

今回3つのファイルを説明しました。template.xmlに関しては、テンプレートに必要なパラメータというものを作れます。recipe.xml.ftlに関しては、ファイル、フォルダの作成のあれこれを制御します。root以下に関しては、細かなアクティビティとかのひな型を配置します、というお話でした。みなさん、やってみたくなりました? なりましたよね? なってください(笑)。はい、以上です。

詳しくはQiitaに記事を書いているので、(スライドを指して)QRコードをパシャって読み込んでください。

新しい試みとして、「Kyash」で投げ銭用のQRコードっていうものを作ってみました。パシャっとやってもらえれば、僕に送金できます。うれしいです(笑)。お金をもらえると僕はうれしいです。喜びます。はい、以上です。

(会場拍手)