Upgrade to Pro — share decks privately, control downloads, hide ads and more …

令和に始めるcode generation

もん
February 13, 2020

令和に始めるcode generation

2020/02/13 cookpad.apk #4 の発表資料です。

もん

February 13, 2020
Tweet

More Decks by もん

Other Decks in Technology

Transcript

  1. マートのAPIはgarageで出来ている • query parameter の fields で指定した値が返ってくる ◦ 必要な分だけ取得するというのが出来る ◦

    (ちょっとGraphQLっぽい) • JSONをクラスにマッピングするときにはmoshi-kotlinを利用している
  2. マートのAPIはgarageで出来ている • query parameter の fields で指定した値が返ってくる ◦ 必要な分だけ取得するというのが出来る ◦

    (ちょっとGraphQLっぽい) • JSONをクラスにマッピングするときにはmoshi-kotlinを利用している • fields 文字列は、マッピング先のclassのプロパティと合わせる必要がある
  3. マートのAPIはgarageで出来ている • query parameter の fields で指定した値が返ってくる ◦ 必要な分だけ取得するというのが出来る ◦

    (ちょっとGraphQLっぽい) • JSONをクラスにマッピングするときにはmoshi-kotlinを利用している • fields は、マッピング先のclassのプロパティと合わせる必要がある • fields をメンテナンスしていくのは非常にめんどくさい ◦ fields とPOJOクラスのダブルメンテ……
  4. 脱線: fields=__default__ garageには fields に特別な文字列( __default__ )を指定できる (各Resourceの必須プロパティを返すようになる) デメリット •

    必須プロパティが何なのか分からなくなる ◦ fields のメンテナンスが困難になる(追加する必要があるのかないのかが分からない) • 本来は不要なデータもあわせて返ってくるのでgarageのメリットが薄れる
  5. どう作るかを理解する • annotationProcessor (kapt) ◦ javax.annotation.processing.Processor ◦ com.google.auto.common.BasicAnnotationProcessor (今回はこれを使います) ▪

    ラウンドなどいろいろな処理を簡素に提供してくれるラッパーProcessor ▪ https://github.com/google/auto/blob/master/common/src/main/java/com/google/auto/common/BasicAnn otationProcessor.java • Kotlinコードの生成 kotlinpoet ◦ https://github.com/square/kotlinpoet
  6. コード生成の流れをイメージする • JsonClassアノテーションが付与されたクラスに対して ◦ コンストラクタに含まれるプロパティの @Json アノテーションを取得する ▪ @Json(name =

    “value”) <- name部分を取得する ◦ @Json アノテーションが付与されたプロパティの型を見て ▪ primitive タイプであれば => nameをそのまま使う ▪ Array<T>, List<T> など => T の部分のプロパティを列挙して [] で囲う ▪ その他 => (おそらくネストされたクラスとみなして)ネストしたプロパティを列挙して [] で囲う ◦ <クラス名>_fields() メソッドを生成して、上で判定した文字列を返す • 全ての <クラス名>_fields() メソッドをまとめる fields() メソッドを作る ◦ 型引数を与えて、型引数によってメソッドの呼び出しを行う
  7. こんなこともあった • Android Gradle Plugin 3.5.0で Jetifier でエラーが出るようになった • 3.5.3

    で出なくなった模様なので、Jetifier のバグだった? • ↓エラー内容 ◦ 17:36:54 Execution failed for task ':app:kaptGenerateStubsDebugKotlin'. 17:36:54 > Could not resolve all files for configuration ':app:kapt'. 17:36:54 > Failed to transform artifact 'generator.jar (project :generator)' to match attributes {artifactType=processed-jar, org.gradle.category=library, org.gradle.dependency.bundling=external, org.gradle.jvm.version=8, org.gradle.usage=java-runtime-jars, org.jetbrains.kotlin.localToProject=public, org.jetbrains.kotlin.platform.type=jvm}. 17:36:54 > Execution failed for JetifyTransform: /mnt/vol/jenkins/workspace/android-mart-pull-request/generator/build/libs/generator.jar. 17:36:54 > Failed to transform '/mnt/vol/jenkins/workspace/android-mart-pull-request/generator/build/libs/generator.jar' using Jetifier. Reason: Cannot open a library at 'FileMapping(from=/mnt/vol/jenkins/workspace/android-mart-pull-request/generator/build/libs/generator.jar, to=/mnt/vol/jenkins/workspace/android-mart-pull-request/generator/build/.transforms/7bd08867addf7e0e0c415bce6c5839ac/jetified-generator.jar)'. (Run with --stacktrace for more details.)