Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlin Multiplatformで考えるクリーンアーキテクチャ
Search
horitamon
July 08, 2024
Programming
0
270
Kotlin Multiplatformで考えるクリーンアーキテクチャ
https://sansan.connpass.com/event/320810/
horitamon
July 08, 2024
Tweet
Share
More Decks by horitamon
See All by horitamon
スタートアップ企業のフェーズ転換期を乗り越えるためのリアーキテクト戦略
horitamon
0
570
ActでGithub Actionsの動作確認をする
horitamon
0
1.3k
Bitrise Pipelinesを使って リリース作業を効率化する
horitamon
0
67
コルーチンを使って処理の見通しをよくする
horitamon
2
2.3k
解決むずかったバグ3選
horitamon
0
470
「OK Google」でアプリの機能を呼び出してみる
horitamon
0
1.5k
Other Decks in Programming
See All in Programming
配送計画の均等化機能を提供する取り組みについて(⽩⾦鉱業 Meetup Vol.21@六本⽊(数理最適化編))
izu_nori
0
150
sbt 2
xuwei_k
0
290
テストやOSS開発に役立つSetup PHP Action
matsuo_atsushi
0
150
AIコーディングエージェント(Manus)
kondai24
0
180
How Software Deployment tools have changed in the past 20 years
geshan
0
29k
React Native New Architecture 移行実践報告
taminif
1
150
大体よく分かるscala.collection.immutable.HashMap ~ Compressed Hash-Array Mapped Prefix-tree (CHAMP) ~
matsu_chara
2
220
30分でDoctrineの仕組みと使い方を完全にマスターする / phpconkagawa 2025 Doctrine
ttskch
4
860
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
110
Why Kotlin? 電子カルテを Kotlin で開発する理由 / Why Kotlin? at Henry
agatan
2
7.2k
Integrating WordPress and Symfony
alexandresalome
0
150
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
6
2.2k
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
Building an army of robots
kneath
306
46k
Raft: Consensus for Rubyists
vanstee
141
7.2k
Unsuck your backbone
ammeep
671
58k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
Done Done
chrislema
186
16k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
How to Ace a Technical Interview
jacobian
280
24k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Scaling GitHub
holman
464
140k
Transcript
Kotlin Multiplatformで 考える クリーンアーキテクチャ horitamon • 2024 年 7月 8日
After Kotlin Fest 2024 LT Night @Sansan
自己紹介 堀 多聞 - horitamon 2020/9〜2024/5 株式会社Voicy Androidエンジニア7年目 登壇: ・DroidKaigi
2022 ・iOSDC 2023 X: @horitamon
https://iosdc.jp/2024/
本日の流れ Kotlin Multiplatformの 導入で考える クリーンアーキテクチャ 1. クリーンアーキテクチャとは 結局何なのか? 2. Kotlin
Multiplatform(KMP)の 概要 3. 課題をクリーンアーキテクチャの 考え方で解決する
今年話そうとしてました https://fortee.jp/kotlin-fest-2024/proposal/c8ec4c4c-206c-4f18-b5a5-7552c49877f7 https://fortee.jp/kotlin-fest-2024/proposal/c0b2c96d-5d09-4612-ba53-3e9ea22e5a5b
「クリーンアーキテクチャ」 知ってますか?
None
None
私はこう思っていました。 • この図は「クリーンアーキテクチャ」という 特定のアーキテクチャを説明する図である • 「クリーンアーキテクチャ」を実現することとは、 この図のようにクラスを定義して 実装していくことである
勘違いしてました。
本文の図の説明を読んでみると… これらのすべてのアーキテクチャを単一の実行可能なアイデア に統合したものである → 複数のアーキテクチャの共通項を示しているだけ! 図は共通項を示している
同じ章でこうも言ってる したがって、この4つ以外にも必要なものはあるだろう。 この4つ以外に認めないというルールはない。 → 4つに分けることが「クリーンアーキテクチャ」を 実現することではない!
ではこの本は 何を言っているんだろう ※予防線を張りますが私の感想です
「ビジネス」より 「手段」は不安定
例えば、名刺を管理する事業だと…
最初は棚で管理するところから初まり… 保存する 取り出す
スーパー名刺管理アドバイザー提供事業や… 預ける 受け取る
PCで使えるツールになったりするかも 写真保存 画面で確認
「どう実現するか」が変化している 写真保存 画面で確認
「手段」は不安定である • ビジネスを実現する手段は多様で、頻繁に変化する • コンサル事業かもしれないし、SaaS事業かもしれない • ソフトウェアとして提供することに固まっても ライブラリはよく更新されるし、よく入れ替えるし UIもよく変わる •
これら手段の変更の影響を ビジネスが受けないようにしたい
「ビジネス」に「手段」が 依存するようにしよう
名刺を管理する事業でいう「ビジネス」は…
名刺の情報を預かり、それを確認できること 名刺情報を預かる 名刺情報を確認する
どういった手段でも提供価値は変わらない 名刺情報を預かる 名刺情報を確認する
サービス目線では手段を意識しないし 名刺情報を預かる 名刺情報を確認する
手段は提供価値を意識して実装する 名刺情報を預かる 名刺情報を確認する
このinterfaceを定義して、それに依存しよう 名刺情報を預かる 名刺情報を確認する
None
名刺情報を預かる 名刺情報を確認する
名刺情報を預かる 名刺情報を確認する
内側の概念に、外側から依存する • 一番中心をビジネスとして実現したい概念とする • 実現したいことを実現するための 詳細な手段が外側の概念 • 詳細な手段はビジネスが何をしたいのかを知るが、 ビジネスはどう実現するのかの詳細を知らない •
この関係性をきれいに実現すると 変更に強く、テストがしやすいソフトになる このルールを一貫して守ろうねという話
とてもわかりやすい説明・資料 • 世界一わかりやすいClean Architecture - nuits.jp blog • 擬人化で完全に理解するクリーンアーキテクチャ -
Speaker Deck • クリーンアーキテクチャ(The Clean Architecture翻訳) | blog.tai2.net
Kotlin Multiplatformとは?
iOS/Webでも動かせるKotlin FW https://www.jetbrains.com/ja-jp/kotlin-multiplatform/
プラットフォームごとに 処理が違うときは?
例えば… • デバイス情報を取得する • ハードウェア(カメラ、センサー、認証など)を 操作する • サードパーティライブラリを使用する →プラットフォームごとに処理が異なる部分を 書き分けたい
expect / actual https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-connect-to-apis.html#expected-and-actual...
実装例 https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-connect-to-apis.html#expected-and-actual...
ただ、課題もある
全部Kotlinで書かないといけない • Android以外のプラットフォーム固有機能を使う処理を Kotlinで書くことになる • Androidエンジニアは機能理解が足りなくて難しい • その他のエンジニアはKotlin / KMPに慣れてなくて難しい
依存解決に手間がかかる • サードパーティライブラリ利用時に iOSの依存解決でCocoaPodsを使うとクセがあった • 独自実装のライブラリをKMP層から直接依存するには Submoduleやライブラリ化が必要
そこで クリーンアーキテクチャの 考え方
KMPにinterfaceを定義して、実装はPF側で https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-connect-to-apis.html#dependency-injection...
実装例 https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-connect-to-apis.html#different-entry-points
None
この構成でうれしいポイント • 各プラットフォームの処理をそれぞれの言語で 実装できる →分担しやすい • より外側のレイヤーの修正 (実装、ライブラリのアップデートや入れ替え)時に ビジネスロジックに変更がなければ KMPモジュールの修正が不要
→より中心に近いレイヤーの処理が守られる
まとめ
クリーンアーキテクチャの内容は どんな設計にも適用できる考え方 • クリーンアーキテクチャは特定の形があるものではない • 中心の概念に向かって依存関係をつくるというルールを一 貫して守ろうという話 • KMPを実装する場合、 プラットフォーム固有部分の依存性を整理すると
変更に強い設計にできる
Thank you!