Advertisement

3分で作る Kotlin Friendly な API

Android Developer at mixi, inc
Mar. 24, 2016
Advertisement

More Related Content

Viewers also liked(20)

Advertisement

Similar to 3分で作る Kotlin Friendly な API(20)

Advertisement

Recently uploaded(20)

3分で作る Kotlin Friendly な API

  1. 3分で作る Kotlin FriendlyなAPI @kikuchy
  2. だれ? • Hiroshi Kikuchi (@kikuchy) • Diverse, inc. (mixi, inc.) • Androidアプリ作ってます
  3. 34301 Lines 432 Files 79.4 Lines/File 6970 Lines 125 Files 55.8 Lines/File
  4. Kotlinは 短く書けて 読みやすい
  5. 本題
  6. 対象 • Kotlinは使い始めくらいの人 • Androidアプリ作れるくらいにはJavaが使える人 • Javaでライブラリ作ってる(作りたい)人
  7. Javaのライブラリ
 作ってて困ったこと
  8. 例:Kenin https://github.com/kikuchy/kenin
  9. // 入力必須で、英字のみもしくは数字のみ可 KeninAndroid.create( mUserId, CompositeCondition.and( Conditions.requireField("require!!!! must put some value!!"), CompositeCondition.or( Conditions.alphabet(), Conditions.numeric() ) ) );
  10. きもい
  11. // 入力必須で、英字のみもしくは数字のみ可 KeninAndroid.create( mUserId, CompositeCondition.and( Conditions.requireField("require!!!! must put some value!!"), CompositeCondition.or( Conditions.alphabet(), Conditions.numeric() ) ) ); 作用されるインスタンスが引数から入る 強制逆ポーランド記法 クラス名長い。かと言ってstatic importしまくるのも避けたい…
  12. 目的 • 「作用されるもの」をレシーバにしたい! • Builderパターン(や、それに類するもの)を
 もっと直感的に、読みやすくしたい!
  13. 材料 • 拡張関数 • 引数末尾がラムダ式であればメッセージ式の丸括弧を省略できること • ラムダ式のreturnは省略できること • thisは省略できること • レシーバ指定関数 • 中置換数 • (演算子オーバーロード)
  14. 完成予想図 // 入力必須で、英字のみもしくは数字のみ可 userId.kenin { requireField() and (alphabet() or numeric()) }
  15. 読める、読めるぞ!
  16. 拡張関数 • TextInputLayoutに新しいメソッド(に見えるstatic メソッド)を生やします // トップレベルで宣言すればいい // thisでレシーバー(この場合はTextInputLayout型のインスタンス)を参照可能 fun TextInputLayout.kenin(…) = KeninAndroid.create(this, …)
  17. 丸括弧の省略 • 最後の引数がラムダ式のとき、メッセージ式の () を 省略できる • ブロックのような表記が可能 // 今回は Condition 型が欲しいので、戻り値で受け取るようにする fun TextInputLayout.kenin(init: () -> Condition) = KeninAndroid.create(this, init())
  18. // この時点で、この表記が可能に! userId.kenin { // ラムダ式末尾のreturnは省略できる CompositeCondition.and( Conditions.requireField(), CompositeCondition.or( Conditions.alphabet(), Conditions.numeric() ) ) }
  19. thisの省略 • staticメソッドのためにクラス名を書きたくない • ブロック内のthisを差し替えてnon-staticな
 メソッド呼び出しにしてしまえばいい // このクラスのインスタンスがthisになってくれればいい class Delegated { fun requireField() = Conditions.requireField() fun alphabet() = Conditions.alphabet() fun numeric() = Conditions.numeric() }
  20. レシーバ指定関数 • 関数のレシーバを型宣言で指定できる • 拡張関数とよく似たようなもの // このクラスのインスタンスがthisになってくれればいい fun TextInputLayout.kenin(init: Delegated.() -> Condition) = KeninAndroid.create(this, Delegated().init())
  21. // 完成は近い! userId.kenin { CompositeCondition.and( requireField(…), CompositeCondition.or( alphabet(), numeric() ) ) }
  22. 中置関数 • 拡張関数の一種として中置関数を作ることができる • 引数は必ず1つである必要がある
 (二項演算でなければならない) • 特定の名前のメソッドを宣言することで演算子の
 オーバーロードもできるので、それで代用する手もある // 同じようにして or のバージョンも作る infix fun Condition.and(another: Condition) = CompositeCondition.and(this, another)
  23. // 完成!! ✧\ ٩۹( 'ω' )‫ﻭو‬ //✧ userId.kenin { requireField() and (alphabet() or numeric()) }
  24. DSLのバリエーション
  25. 相性がいいものは? • 設定項目が多くて • 構造化が必要かもしれなくて • Javaで書くとつらいもの
  26. Anko • https://github.com/Kotlin/anko • DSLでAndroidのUIをつくるためのライブラリ • たろうさんのスライドがあるのでそちらをご参照ください • Ankoは甘くて美味しい~Ankoに見るKotlinの表現力~ #gunosybeer • http://sssslide.com/speakerdeck.com/ntaro/ ankohagan-kutemei-wei-sii-ankonijian-rukotlinfalsebiao- xian-li-number-gunosybeer
  27. kotlinx.html • https://github.com/Kotlin/kotlinx.html
 • KotlinでDOMツリーを作ることができる • サーバーサイドでのテンプレート作成はもちろん • KotlinはJavaScriptにもトランスパイルできる、
 ということは…!
  28. Kotlin NoSQL • https://github.com/cheptsov/kotlin-nosql • MongoDBのクエリもDSLで構築可能 • (Mongoは使ったこと無いので詳しいことはわかり ません)
  29. ここが惜しいよKotlin
  30. && と || のオーバーロードは できない? • 四則演算子やほとんどの比較演算子はオーバーロードできるのだけ れど… • Kotlinのリファレンスを見ても、&&と||は記載がない • https://kotlinlang.org/docs/reference/operator- overloading.html • andとかorとか書いてもダメだった • Booleanクラスにはandとorメソッドがある • 諦めも肝心
  31. まとめ • Kotlinの言語機能を駆使すれば可読性が高いDSLも 作れる • JavaライブラリのKotlinラッパーを用意すると Kotlinist達にも親切
  32. こちらもよろしく Kenin
 real-time validation framework for Java & Kotlin https://github.com/kikuchy/kenin
  33. @kikuchy
Advertisement