Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
68
コルーチンを使って処理の見通しをよくする
horitamon
2
2.3k
解決むずかったバグ3選
horitamon
0
470
「OK Google」でアプリの機能を呼び出してみる
horitamon
0
1.5k
Other Decks in Programming
See All in Programming
tparseでgo testの出力を見やすくする
utgwkk
2
280
生成AIを利用するだけでなく、投資できる組織へ
pospome
2
410
TerraformとStrands AgentsでAmazon Bedrock AgentCoreのSSO認証付きエージェントを量産しよう!
neruneruo
4
1.8k
AI時代を生き抜く 新卒エンジニアの生きる道
coconala_engineer
1
420
メルカリのリーダビリティチームが取り組む、AI時代のスケーラブルな品質文化
cloverrose
2
370
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
1.7k
Graviton と Nitro と私
maroon1st
0
130
Go コードベースの構成と AI コンテキスト定義
andpad
0
140
「コードは上から下へ読むのが一番」と思った時に、思い出してほしい話
panda728
PRO
39
26k
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
0
170
モデル駆動設計をやってみようワークショップ開催報告(Modeling Forum2025) / model driven design workshop report
haru860
0
280
Navigating Dependency Injection with Metro
l2hyunwoo
1
180
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
286
14k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
2
65
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
94
How STYLIGHT went responsive
nonsquared
100
6k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.3k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.3k
Mobile First: as difficult as doing things right
swwweet
225
10k
Are puppies a ranking factor?
jonoalderson
0
2.4k
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!