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
マルチモジュール懐疑派だったかつての自分に送る マルチモジュールの効能
Search
mikan
December 13, 2023
Technology
0
150
マルチモジュール懐疑派だったかつての自分に送る マルチモジュールの効能
https://karabiner.connpass.com/event/302850/
mikan
December 13, 2023
Tweet
Share
More Decks by mikan
See All by mikan
再考: 監視可能オブジェクト
mikanichinose
0
25
書評: 単体テストの考え方/使い方
mikanichinose
0
180
ComposeでリストUIをDraggableにする方法
mikanichinose
0
750
Composeのライフサイクル対応を支援するLifecycleEventEffectの紹介
mikanichinose
1
420
Composeでカスタムレイアウトを組むときの気持ち
mikanichinose
0
270
Other Decks in Technology
See All in Technology
20分で完全に理解するGrafanaダッシュボード
hamadakoji
5
910
Microsoft Intune 勉強会 第 2 回目
tamaiyutaro
2
460
今年のRubyKaigiはProfiler Year🤘
osyoyu
0
430
How to do well in consulting–Balkan Ruby 2024
irinanazarova
0
150
「スニダン」開発組織の構造に込めた意図 ~組織作りはパッションや政治ではない!~
rinchsan
4
620
実例で紹介するRAG導入時の知見と精度向上の勘所
yamahiro
5
1.7k
個人のAWSアカウントをマルチ運用してみた
miura55
2
150
一生覚えておきたい「システム開発=コミュニケーション」〜初めての実務案件振り返りLT〜
maimyyym
2
330
競技としてのKaggle、役に立つKaggle
yu4u
6
2.4k
Babylon.js JAPAN活動紹介 (2024/4)
limes2018
1
120
Python と Snowflake はズッ友だょ!~ Snowflake の Python 関連機能をふりかえる ~
__allllllllez__
2
140
EMとして2023年度に頑張ったこと / What we did well in FY2023 as a EM
pauli
1
260
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
226
17k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
126
32k
4 Signs Your Business is Dying
shpigford
176
21k
Learning to Love Humans: Emotional Interface Design
aarron
267
39k
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3.1k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
123
39k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
22
1.4k
Building an army of robots
kneath
300
41k
Designing for Performance
lara
601
67k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
22
1.6k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
15
1.6k
Designing with Data
zakiwarfel
96
4.8k
Transcript
マルチモジュール懐疑派だったかつての自分に送る マルチモジュールの効能 モバイルアプリLT 会 一瀬喜弘(@mikanIchinose)
自己紹介 object Mikan { val name = " 一瀬喜弘" val
company = "karabiner.tech" val work = Engineer.Android val hobby = listOf( " 漫画", " アニメ", " ゲーム", " 折り紙", "OSS 開発・コントリビュート", ) }
巷ではマルチモジュールが流行ってるっぽいけど なんであんな複雑そうな構成が流行るのか分からん
とかつて思っていた自分の疑問に答える形式で マルチモジュール構成の利点を解説
Q1 モジュールに分けて何が嬉しいの? Q2 モジュールを 分けると プロダクションコード以外の ファイルが 増えて、 管理コストが 増すのでは?
Q3 開発スピードが落ちそう Q4 モジュールを上手に分けられる気がしない
Q1 モジュールに分けて何が嬉しいの?
1 依存の方向をビルド構成によって定義できる モノモジュール 何が何に依存しててもおかしくない
1 依存の方向をビルド構成によって定義できる マルチモジュール ビルド構成によって依存関係を厳密に規定できる feature-module はdata-module のコンポーネントを、domain-module はfeature- module のコンポーネントをインポートすることが不可能
// feature/build.gradle.kts implementation(project(":domain")) // domain/build.gradle.kts implementation(project(":data"))
2 関係ないコンポーネントが思考を遮らない モノモジュール . └── app └── src ├── data
│ ├── AuthRepository.kt │ ├── AuthRepositoryImpl.kt │ ├── UserRepository.kt │ └── UserRepositoryImpl.kt ├── domain │ ├── GetUserUseCase.kt │ └── LoginUseCase.kt └── ui ├── LoginScreen.kt ├── LoginViewModel.kt ├── SplashScreen.kt └── SplashViewModel.kt
2 関係ないコンポーネントが思考を遮らない マルチモジュール . ├── app │ └── src │
└── MainActivity.kt ├── data-api │ └── src │ └── data │ ├── AuthRepository.kt │ └── UserRepository.kt ├── data-impl │ └── src │ └── data │ ├── AuthRepositoryImpl.kt │ └── UserRepositoryImpl.kt ├── domain │ └── src │ └── domain │ ├── GetUserUseCase.kt │ └── LoginUseCase.kt └── feature ├── login │ └── src │ └── feature │ └── login │ └── ui │ ├── LoginScreen.kt │ └── LoginViewModel.kt └── splash └── src └── feature └── splash └── ui ├── SplashScreen.kt └── SplashViewModel.kt
3 モジュールに分けられる構造 = 良い設計 モジュールとして切り離すことができるということは以下を達成しないといけないので自ずと良い設計になる 疎結合 共通パーツは共通なモジュール(shared, common, core) として切り出したくなる
機能間の依存がなくなるのでfeature-module 内の変更がモジュールで完結する 循環依存しない コンパイル不可能
モジュールを 分けると プロダクションコード以外の ファイルが 増えて、
管理コストが 増すのでは?
マルチモジュールを触りだしたころはそう思っていた
1 新しくモジュールを作るという作業は面倒 new module したときにウィザードで正しい項目を入力できているだろうか Package name とか入力するの地味にめんどくさい あとから修正したくなったときにどこまで修正したら完了なのか分からん hoge/src/main/
hoge/fuga hoge/src/main/AndroidManifest.xml hoge/build.gradle(.kts) やること自体はそこまで多くないので割とすぐ習熟する ` `
ソースコード以外はほとんど変化することがないので 作ってしまえばほぼ終わり
2 ビルド設定の共通化という難所 gradle に対する習熟度が求めれる 手段が幾通りもありどれに手を出そうか迷う 共通構成を記載したgradle ファイルを作り、各build.gralde でapply する とくにキャッシュされるわけではないのでビルドタイムには貢献しない
Convention Plugin 共通処理をプラグインとして定義する
2 ビルド設定の共通化という難所 Convention Plugin precompiled script plugin .gradle.kts ファイルで書く 依存やバージョンをKotlin
ファイルで管理 → Version Catalog が主流になったので不要かも standalone gradle plugin .kt ファイルで書く せっかく依存をVersion Catalog で管理したのに文字列で指定しなくちゃいけなくなるので微妙な気持 ち 最新のサンプル実装(nowinandroid) はこちらを使用している more information https://star-zero.medium.com/gradle のconvention-plugins-ba19a1332540 https://speakerdeck.com/jmatsu/gradle-convention-plugins
Q3 開発スピードが落ちそう
コードを書くスピードは落ちることもある
しかし、それとこれとはスコープの違う話
マルチモジュールは設計の道具 設計する = 戦略的思考 コードを書く = 戦術的思考
Q4 モジュールを上手に分けられる気がしない
アーキテクチャとか 設計系の 技術書で 勉強してください クリーンアーキテクチャ 単体テストの考え方/ 使い方
iOS アプリ設計パターン入門 ソフトウェアアーキテクチャの基礎 ー エンジニアリングに基づく体系的アプローチ ドメイン駆動設計
バックエンドや フロントエンドの トレンドも 参考になる バックエンド モノリス モジュラーモノリス
マイクロサービス フロントエンド コンポーネント指向 Atomic Design
まとめ Q1 モジュールに分けることの嬉しさ → 良い設計をこころがけるようになる Q2 管理コストの増大 → あまり変化しないのでコストにならない Q3
開発スピードの低下 → 頭の使い方が違うだけなので慣れれば低下しない Q4 モジュール分割難しい → アーキテクチャとか設計の勉強して