Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
KMPを使ってみて感じた良いところ・ツラいところ
Search
Ryu-nakayama
October 05, 2023
Programming
0
180
KMPを使ってみて感じた良いところ・ツラいところ
stmn#2の登壇資料です
Ryu-nakayama
October 05, 2023
Tweet
Share
More Decks by Ryu-nakayama
See All by Ryu-nakayama
効率化に挑戦してみたらモバイル開発が少し快適になった話
ryunakayama
0
140
新卒1年目がプロジェクトを進めるときにコケたポイント
ryunakayama
1
190
期限が近づいてきた!Privacy Manifests対応
ryunakayama
5
7.1k
新卒iOSエンジニアとしてやってきたこと
ryunakayama
0
160
今年学んだ便利ツール_便利技
ryunakayama
0
88
git worktreeを使って複数ブランチを扱いやすくする
ryunakayama
0
750
SwiftUIに適した新アーキテクチャの導入に挑む
ryunakayama
2
7.3k
Swiftでテスト時のみ『private』にアクセスする方法
ryunakayama
1
750
Other Decks in Programming
See All in Programming
CA.swift19 恋するAIアプリ開発の裏側
oskmr
0
380
禅の心を手に入れよ
eltociear
1
280
大規模UIKitベースアプリへのTCAの段階的導入/gradual-adoption-of-tca-in-a-large-scale-uikit-based-app
takehilo
2
200
dbtのドメイン分割による データ基盤の改善とDigdagとの連携
sakama
0
440
Hanami and htmx
bkuhlmann
0
220
AWS CDKコントリビュートTIPS / aws-cdk-contribution-tips
gotok365
4
330
Code Reviews
bkuhlmann
4
890
Git Rebase
bkuhlmann
11
1.6k
サイコロで理解する統計的仮説検定の考え方
tatamiya
4
1k
AppRouter Panel Talk
yosuke_furukawa
PRO
1
450
Goのmultiple errorsについて (2024年4月版)
syumai
4
1.1k
#phpcon_odawara オープン・クローズドなテストフィクスチャを求めて / open closed test fixtures
77web
3
240
Featured
See All Featured
Web development in the modern age
philhawksworth
203
10k
10 Git Anti Patterns You Should be Aware of
lemiorhan
649
58k
Gamification - CAS2011
davidbonilla
77
4.6k
Designing Experiences People Love
moore
136
23k
Web Components: a chance to create the future
zenorocha
306
41k
The Power of CSS Pseudo Elements
geoffreycrofte
61
5k
How to name files
jennybc
65
93k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
242
1.2M
Optimizing for Happiness
mojombo
370
69k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
13
8.3k
How STYLIGHT went responsive
nonsquared
92
4.8k
Art, The Web, and Tiny UX
lynnandtonic
290
19k
Transcript
Chatwork株式会社 モバイルアプリケーション開発部 中山 龍 2023年10月6日 KMPを使ってみて感じた 良いところ・ツラいところ
自己紹介 中山 龍 (なかやま りゅう) • Chatwork株式会社 ◦ iOSエンジニア ◦
2023年4月 新卒として入社 ◦ 社内最年少 (2002年6月生まれの21歳) • 愛知県在住 ◦ フルリモート勤務 ◦ 最近名古屋市内に引っ越しました 2 @ryu_develop
注意
このLTの趣旨 4 このLTは『普段iOSネイティブを触っているエンジニアがKMP を体験してみたよ』という話です KMPに関する深い知見を持っている立場ではないことにご注意ください
各モバイル開発手法の比較
①ネイティブ
①ネイティブ 7 iOS / Androidそれぞれに専用のプログラムを書いて実装する iOS Android
メリット ネイティブの特徴 8 デメリット • 標準のUIやOSの新機能を使える ◦ OSによって提供される最新機能も 使用可能 •
高いパフォーマンスが期待できる • 各OSでの開発が必要 ◦ iOS/Androidに合わせて2つ作成す ることが必要となる ◦ 各OSで開発者に必要な技術が統一 できない
②クロスプラットフォーム ※ ※ ここでは共通のソースコードのみで各 OSのアプリが ビルド可能になるものを指す
②クロスプラットフォーム 1つのプログラムでiOS / Androidそれぞれ動作するようにする 10 iOS / Android など
メリット クロスプラットフォームの特徴 11 デメリット • 1つのソースコードで各OSの開 発ができる ◦ ネイティブでの開発と比べて開発 コストが低く済む
• OSの機能や最新技術が利用できない場 合がある • 複雑な機能には各ネイティブのコード を書く必要がある場合がある • ネイティブに比べてパフォーマンスが 落ちる場合がある
12 ネイティブのように標準のUIやOSの最新機能を使いたいけ ど、クロスプラットフォームのように共通のコードで楽したい...
13 ネイティブのように標準のUIやOSの最新機能を使いたいけ ど、クロスプラットフォームのように共通のコードで楽したい... そこで、部分的に共通化するという選択肢
KMPを導入する
KMPって何?
KMPって何? KMP = Kotlin Multiplatform 16
KMPって何? KMP = Kotlin Multiplatform 17 Kotlinを使って、クロスプラットフォームプロジェクト の開発を簡素化する技術
KMPって何? 少し前だと... KMPを使って、モバイル開発に特化した機能や技術を実現した ものをKMMと呼んでいた ↓ 名称がKMPに統一された 18
KMPって何? 本LTでの『KMP』という表現は 従来の『KMM』のイメージ 19
部分的に共通化する
ネイティブの開発をしていると 21 ネイティブで各OSをそれぞれ開発していると... こう考えることもあるのではないでしょうか? • iOSもAndroidもドメイン知識は共通なのになぁ... • アプリ特有のこの処理、共通なのになぁ...
ネイティブの開発をしていると 22 ネイティブで各OSを開発していると... こう考えることもあるのではないでしょうか? • iOSもAndroidもドメイン知識は共通なのになぁ... • アプリ特有のこの処理、共通なのになぁ... でも •
OS標準のUIや新機能を使って実装したい部分もある...
ネイティブの開発をしていると 23 ネイティブで各OSを開発していると... こう考えることもあるのではないでしょうか? • iOSもAndroidもドメイン知識は共通なのになぁ... • アプリ特有のこの処理、共通なのになぁ... でも •
OS標準のUIや新機能を使って実装したい部分もある... 部分的に共通化するのに使えるのがKMP
KMP(共通部分) 部分的に共通化 共通化する部分はKMPで書き、 必要な部分はそれぞれのネイティブで書く 24 iOS Android
KMPを使うことで... 25 • ネイティブ開発と比べて労力を抑えられる ◦ それぞれのOSに合わせて作る部分を減らすことができる • OSの機能や標準のUIを呼び出すことが可能 ◦ 呼び出したい部分はネイティブで記述する
実際に使ってみた
実装してみる題材
実装してみる題材 • UIにはそれぞれ以下のもので実装する ◦ iOS: SwiftUI ◦ Android: Jetpack Compose
28 TODOアプリを作る • TODOを一覧表示でき、新規に追加ができる ◦ 入力欄に文字を入力し、追加ボタンを押す • TODOの達成・未達成を切り替えることができる ◦ 表示されているTODOの横のアイコンをタップすることで切り替えられる iOS / Androidどちらも実装する
共通化する部分 29 TODOのロジック プレゼンテーションロジック プレゼンテーションロジック UI(SwiftUI) UI(Jetpack Compose)
実装してみた
アプリ起動時 iOS 31 Android
iOS Android テキストフィールドに内容を入力 32
iOS Android 追加ボタンを押すとリストに追加される 33
iOS Android 同様に2件目も追加できる 34
iOS Android アイテム右のアイコンタップで 赤丸→チェック になる 35
サンプルコードのリポジトリ https://github.com/Ryu-nakay/todo-app-with-kmp 36
KMPを使ってみての感想
良いと思ったところ1 共通のロジックを書かなくて済む 38 KMP(Kotlin)を使って書くことで、Swiftで再度書き直す手間が省 けた 今回は、『TODOの表現や振る舞いを定義するコード』を共通化した • 1件のTODOを表す型 • 完了・未完了切り替えの処理
• 複数のTODOの集合を表す型 • TODO追加の処理 など
OS間も含めた『コードの重複』を減らし、高い変更容易性を実現 できる 良いと思ったところ2 39 共通化した部分は仕様の変更が楽 • TODOの表現を変える ◦ ex)『期限』を追加する •
TODOの振る舞いを変える ◦ ex) 『削除』を可能にする といった変更が今後あったとしても... KMP(Kotlin)で共通化したコードを変更するだけで変更を実現可能
ツラいところ1 40 iOS側では型が期待したものではない また、KotlinArrayの要素数すら、型はIntではなくInt32 KMP(Kotlin) Swift Int Int32 Array<T> KotlinArray<T>
一部を挙げると、以下の表のような型になってしまう SwiftからKMPを呼び出した際の型がなかなか不自由... この問題を解消するために何かしら手を打たないとツラい
ツラいところ2 41 Xcodeではサジェストが弱い・コード定義も見られない その型が持っているプロパティ・メソッドがサジェストされるかは割と気まぐれ → サジェストしてもらうというのは期待しない方がよい また、KMPの型やメソッドの実装を見たいと思っても、KotlinやSwiftのコードで見ることは できない😱 (KMPの実装をiOS側で使用する際に、 ObjCヘッダーファイルとして生成されてしまうため
) 実装を見ようとするとツラいものが見える
使ってみてのまとめ 『部分的に共通化する』という考え方はとても良いものだと思った → だが、KMPには良いところだけでなく、ツラいポイントも存在している 42 しっかりと知見を持って • KMPを導入することで得られるメリットが大きいかどうか • KMPを導入するのなら、どのようにツラいポイントと向き合うのか
を考える必要があると感じた。 『何も考えずKMPを導入すればハッピー』
働くをもっと楽しく、創造的に