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
Kotlin Multiplatformで考えるクリーンアーキテクチャ
Search
horitamon
July 08, 2024
Programming
0
180
Kotlin Multiplatformで考えるクリーンアーキテクチャ
https://sansan.connpass.com/event/320810/
horitamon
July 08, 2024
Tweet
Share
More Decks by horitamon
See All by horitamon
スタートアップ企業のフェーズ転換期を乗り越えるためのリアーキテクト戦略
horitamon
0
550
ActでGithub Actionsの動作確認をする
horitamon
0
1.2k
Bitrise Pipelinesを使って リリース作業を効率化する
horitamon
0
65
コルーチンを使って処理の見通しをよくする
horitamon
2
2.2k
解決むずかったバグ3選
horitamon
0
430
「OK Google」でアプリの機能を呼び出してみる
horitamon
0
1.4k
Other Decks in Programming
See All in Programming
都市をデータで見るってこういうこと PLATEAU属性情報入門
nokonoko1203
1
590
Blazing Fast UI Development with Compose Hot Reload (droidcon New York 2025)
zsmb
1
280
AI時代のソフトウェア開発を考える(2025/07版) / Agentic Software Engineering Findy 2025-07 Edition
twada
PRO
50
13k
Porting a visionOS App to Android XR
akkeylab
0
230
#kanrk08 / 公開版 PicoRubyとマイコンでの自作トレーニング計測装置を用いたワークアウトの理想と現実
bash0c7
1
680
GraphRAGの仕組みまるわかり
tosuri13
8
520
Node-RED を(HTTP で)つなげる MCP サーバーを作ってみた
highu
0
120
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
220
『自分のデータだけ見せたい!』を叶える──Laravel × Casbin で複雑権限をスッキリ解きほぐす 25 分
akitotsukahara
2
610
Google Agent Development Kit でLINE Botを作ってみた
ymd65536
2
220
なぜ適用するか、移行して理解するClean Architecture 〜構造を超えて設計を継承する〜 / Why Apply, Migrate and Understand Clean Architecture - Inherit Design Beyond Structure
seike460
PRO
3
740
初学者でも今すぐできる、Claude Codeの生産性を10倍上げるTips
s4yuba
13
8.6k
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
Adopting Sorbet at Scale
ufuk
77
9.4k
Building Adaptive Systems
keathley
43
2.6k
GraphQLとの向き合い方2022年版
quramy
49
14k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
730
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
500
Building an army of robots
kneath
306
45k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Unsuck your backbone
ammeep
671
58k
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!