Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

3分で作る Kotlin Friendly な API

2,894 views

Published on

第2回Kotlin勉強会 @ Sansan で発表した(する)資料です。

Published in: Engineering
  • Be the first to comment

3分で作る Kotlin Friendly な API

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

×