Slide 1

Slide 1 text

Kotlin/MPPでX-PF 事始めのつまづきポイント 2019-03-27 どこでもKotlin #7 @yashims85

Slide 2

Slide 2 text

誰? 名前: 屋代昌也 会社: 株式会社モバイルファクトリー Twitter: @yashims85 Github: yashims

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Mobile Factoryではエンジニアを募集し ています。 位置ゲーやBlockChainにご興味のある かたはぜひお声がけください!

Slide 5

Slide 5 text

そもそもなんでKotlin/MPP触りだ したのか?

Slide 6

Slide 6 text

それはね、 READMEにこう記されてい るわ

Slide 7

Slide 7 text

遥か悠久の昔、cocos2dxのプロジェクトがあった。 cocos2dxのプロジェクトはたいそう荒ぶり、ついには android-Appとios-Appという2 つのリポジトリを生み眠りについた。 cocos2dxより生まれし2つのリポジトリは数刻の後に空を作り海を作り大地を作っ た。 やがて人々が生まれ、彼らはこの厳しくも儚い大地に根を下ろしその繁栄を謳歌した のである。 時は今、天は唸り、地は裂け、この厳しくも儚い世界はまさに終わりを迎えようとして いた。 人々は思い出したのである。彼らが在る天地は荒ぶる cocos2dxの仔によって 創造されたことを。 そして人々はついに決意する。彼らを育てた天地を離れ、安住の地へ旅立つことを。

Slide 8

Slide 8 text

いい感じにクライアントサイドをリプレイスし たい! 現在絶賛リプレイス中ですが、今回はその中で得られ た気づきや知見を共有します。

Slide 9

Slide 9 text

Kotlin/MPP 構成がわからない問題

Slide 10

Slide 10 text

今Kotlin/MPPでやっている事 ● Android/iOSのクライアントアプリ開発 ● Kotlin/MPPでつかえるプレゼンテーションルーター ライブラリ開発

Slide 11

Slide 11 text

クライアントアプリ ● 長期運用タイトルのクライアントサイドのリプレース ● Kotlin/MPPを使用してクライアントのビジネスロジック を共通化する

Slide 12

Slide 12 text

クライアントアー キテクチャ

Slide 13

Slide 13 text

KoRouter ● Kotlin/MPPで書かれたクライアントサイドのプレゼン テーションルーター ● VueRouterみたいなものを作りたい ● 現在絶賛開発中 ● https://github.com/yashims/kotlin-router

Slide 14

Slide 14 text

KoRouterの使い方 private val router: KoRouter = KoRouter { route("") { name = "" component = this@MainActivity children { route("/") { name = "top" component = TopFragment() } route("gallery") { name = "gallery" component = GalleryFragment() children { route(":detail") { name = "detail" component = GalleryDialogFragment() } } } } } }

Slide 15

Slide 15 text

KoRouterの使い方 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) router.push("/") }

Slide 16

Slide 16 text

KoRouterの構成 ● commonMain ● jvmMain ● iosMain の3つからなる

Slide 17

Slide 17 text

KoRouterの構成 - 共通部分 commonMain ● 共通コード ● 成果物はmetadata ● metadataだけでは何もできず、IDEなどがシンボルを追 うために使うはず。

Slide 18

Slide 18 text

KoRouterの構成 - Android部分 jvmMain ● JVM向けコード ● 成果物が.jarなのでAndroidはこれを使う

Slide 19

Slide 19 text

KoRouterの構成 - iOS部分 iosMain ● Native向けコード ● .frameworkが成果物なのでiOSではこれをつかう

Slide 20

Slide 20 text

ではクライアントアプリも同じ構成で 作れるのか

Slide 21

Slide 21 text

答えはNO

Slide 22

Slide 22 text

AndroidのPFに依存するコードが 出てくるので、.jarでの提供では役 不足になってくる

Slide 23

Slide 23 text

クライアントアプリの構成 ● commonMain ● jvmMain -> androidMain ○ JVM向けのサブセットと考えて良い ● iosMain ● main

Slide 24

Slide 24 text

mainとは?

Slide 25

Slide 25 text

クライアントアプリの構成 - main ● Androidの依存を使うためにcom.android.libraryの pluginを使用する ● Androidのbuildには、何もしなければsrc/mainの中に AndroidManifest.xmlを置く必要がある ● .aarの成果物ができる ● ごにょってandroidMainに統合するのが妥当

Slide 26

Slide 26 text

構成比較 KoRouter ● commonMain ● jvmMain ● isoMain クライアントアプリ ● commonMain ● androidMain ● iosMain ● main -> androidMainへ混入

Slide 27

Slide 27 text

目的によってプロジェクトの構成 が変わる!

Slide 28

Slide 28 text

dependenciesわからない問題

Slide 29

Slide 29 text

さて、今から皆さんにcoroutines 関連のライブラリ名の一覧をお見 せします。 それぞれ何をするライブラリかわかりますでしょうか?

Slide 30

Slide 30 text

coroutine関連のライブラリ ● kotlinx-coroutines-core-common ● kotlinx-coroutines-core ● kotlinx-coroutines-android ● kotlinx-coroutines-core-native ● kotlinx-coroutines-core-js

Slide 31

Slide 31 text

答え:

Slide 32

Slide 32 text

common用 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.1.1'

Slide 33

Slide 33 text

jvm用 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1'

Slide 34

Slide 34 text

android用 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'

Slide 35

Slide 35 text

ios用 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.1.1'

Slide 36

Slide 36 text

js用 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-js:1.1.1'

Slide 37

Slide 37 text

全部同じ事をするための ライブラリ

Slide 38

Slide 38 text

構成によってdependenciesが違う ● 言語的に可能でも実行環境によって不可能だったり、よ り適切な処理があったりする ● 例えばcoroutineはThreadProgrammingをサポートす るが、Androidの場合メインスレッドのとり方がAndroid 用のものになったり

Slide 39

Slide 39 text

そんな課題を乗り越えて CoroutineのGettingStartedを やっているとある問題に直面する

Slide 40

Slide 40 text

GettingStarted fun hoge() { runBlocking { delay(200L) } } commonMain/kotlin/Sample.kt GettingStartedに記載されてる runBlockingが無い!

Slide 41

Slide 41 text

試しにこの状態でBuildを通してみると 通る!

Slide 42

Slide 42 text

jvmMainに移してみる fun hoge() { runBlocking { delay(200L) } } jvmMain/kotlin/Sample.kt 通る!

Slide 43

Slide 43 text

最初はdependenciesを疑ったが… ● commonで通らないのは、なにか別のdependenciesを 入れる必要があるのではと考えた ● でも実際はそういう仕様だった ● runBlockingの動作がjsで実現出来ないために commonで使えないようになっている ● あくまでmetadataにリファレンスが無いだけなので、書 いておけばjvmやnativeでbuildすることはできる

Slide 44

Slide 44 text

kotlinxわからない問題

Slide 45

Slide 45 text

たとえばcoroutineなら、 GettingStartedをやれば、なん やかんやでcoroutineを完全理解 した状態になれる

Slide 46

Slide 46 text

KotlinのCoroutine完全に理解した ● CoroutineScope <- 見ないようにしてる ● チャネル <- 見ないようにしている ● kotlinx-coroutines-reactive <- 見ないようにしてる ● kotlinx-coroutines-reactor <- 見ないようにしてる

Slide 47

Slide 47 text

KotlinのCoroutineがちょっとできるよ うになるためには、何をみたら良いか知見 がある人教えてください… Goroutineのドキュメントあたり参考になるのか?とは考えて る。

Slide 48

Slide 48 text

コードのエントロピーが増大する問 題

Slide 49

Slide 49 text

コードのエントロピー増大問題 ● イレギュラーな事態になってもKotlinはなんとか出来てし まうパワフルさがある ● そのパワフルさに依存するとエントロピーが増大していく ● 結局適切な抽象化ときれいな設計を行うことに尽きる ● きれいな設計を行うと、イレギュラーに遭遇すること事態 が少なくなる ● 今回挙げたような問題にも対処しやすくなる

Slide 50

Slide 50 text

まとめ

Slide 51

Slide 51 text

まとめ ● 目的によって構成を変えよう ● なにが同じライブラリかは何処かにまとめておこう ● GettingStarted通りに出来なくても泣かない ● kotlinxわからん ● 設計大事

Slide 52

Slide 52 text

Thank You!