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
Androidアプリのモジュール分割における:x:commonを考える
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
okuzawats
December 20, 2024
Programming
1
450
Androidアプリのモジュール分割における:x:commonを考える
Ebisu.mobile #8 大忘年会 STORES kubell Kyash asken
https://hey.connpass.com/event/335971/
での発表資料です。
okuzawats
December 20, 2024
Tweet
Share
More Decks by okuzawats
See All by okuzawats
「Chatwork」Android版アプリを 支える単体テストの現在
okuzawats
0
430
カンファレンス参加をいかに正当化するか
okuzawats
0
340
「勉強になった」で終わらせない、ストロングスタイルの勉強会
okuzawats
0
440
10年モノのAndroidアプリのコード品質を改善していく、3つの取り組み
okuzawats
0
1.4k
Androidアプリ開発におけるSonarCloudの活用
okuzawats
0
1.3k
何故、UseCaseは1メソッドなのか
okuzawats
3
2.2k
例外を投げるな、値を返せ
okuzawats
9
8.2k
GitHub ActionsでAndroidアプリのテストを回しまくってたら全プロジェクトのCI/CDが完全停止する寸前だった件
okuzawats
0
690
Kotlinのifを愛でる
okuzawats
0
1k
Other Decks in Programming
See All in Programming
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.4k
Codex CLIのSubagentsによる並列API実装 / Parallel API Implementation with Codex CLI Subagents
takatty
2
310
Takumiから考えるSecurity_Maturity_Model.pdf
gessy0129
1
160
飯MCP
yusukebe
0
250
脱 雰囲気実装!AgentCoreを良い感じにWEBアプリケーションに組み込むために
takuyay0ne
3
390
[PHPerKaigi 2026]PHPerKaigi2025の企画CodeGolfが最高すぎて社内で内製して半年運営して得た内製と運営の知見
ikezoemakoto
0
280
Rethinking API Platform Filters
vinceamstoutz
0
160
How to stabilize UI tests using XCTest
akkeylab
0
140
AIコードレビューの導入・運用と AI駆動開発における「AI4QA」の取り組みについて
hagevvashi
0
550
nuget-server - あなたが必要だったNuGetサーバー
kekyo
PRO
0
440
Nostalgia Meets Technology: Super Mario with TypeScript
manfredsteyer
PRO
0
110
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
590
Featured
See All Featured
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
100
How GitHub (no longer) Works
holman
316
150k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
200
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
160
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
140
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
330
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4k
Optimizing for Happiness
mojombo
378
71k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.5k
Transcript
Androidアプリのモジュール分割 における:x:commonを考える 2024/12/20 Ebisu.mobile #8 大忘年会 STORES kubell Kyash asken
/ 奥澤俊樹
自己紹介 奥澤 俊樹(@okuzawats) Androidアプリエンジニア / 株式会社kubell ビジネスチャット「Chatwork」 Android版アプリを作っ ています。 来年は前厄です。
事業概要 *1 Nielsen NetView 及びNielsen Mobile NetView Customized Report 2024年4月度調べ月次利用者(MAU:Monthly
Active User)調査。 調査対象はChatwork、Microsoft Teams、Slack、LINE WORKS、Skypeを含む41サービスを株式会社kubellにて選定。 *2 2024年9月末時点。 • 国内最大級のビジネスチャット「Chatwork」を展開。 業界のパイオニアであり国内利用者数No.1*1、導入社数は60.5万社*2を突破 • 圧倒的な顧客基盤とプラットフォームを背景に、DXされた業務プロセスそのものを提供する クラウドサービス、BPaaSを展開 BPaaS (Business Process as a Service) ビジネスチャット「Chatwork」 お客様 オペレーター
Androidアプリのモジュール分割に おける:x:commonを考える
「Chatwork」Android版アプリ
モジュール分割 サービスの拡大と、メンバー・チームの増加に伴い、モジュール分割の必要性が高まってき ました。まだ途上ではありますが、去年(2023年)からモジュール分割を進めています。 モジュール分割の狙いは、アプリの規模(コードのサイズ、メンバーやチームの数)が大き くなっても開発速度を維持していくこと、将来の予測できない変化にすばやく対応できる能 力を持つことです。 具体的には、以下のようなメリットを期待しています。 - 関心の分離と依存方向の強制(目指すアーキテクチャの実現) -
モジュールごとのビルドキャッシュを利用したビルド高速化 - コンフリクト発生頻度低減による開発速度の維持 - などなど
モジュール分割 大まかには、以下のような方針でモジュール分割を進めています。
モジュール分割 レイヤごとにモジュール化し、さらにサブモジュールを作ることもあります。
モジュール分割 :featureモジュールには、View・ViewModelなどプレゼンテーションに関するコードが存 在します。
モジュール分割 今日は、この中でも特に:commonモジュールについて考えてみます。
:x:common
:x:commonとは :xの各サブモジュールから参照される、各サブモジュールの共通コードの置き場となるモ ジュールを指す。 :x:commonもまた:xのサブモジュールであるが、他のサブモジュールから参照される特別な サブモジュール。
:x:commonとは きちんと考えないと多くのコードがcommonモジュールに置かれてしまい、本来モジュール 分割から得られたはずのメリットが得られなくなる可能性がある。 - :x:commonの修正は影響範囲が大きく、影響の確認に手間がかかる。 - 他チームの作ったモジュールに影響すると、コミュニケーションコストが増える。 - その結果、メンバー・チームが増えた時の開発速度低下につながる可能性がある。
:x:commonとは 「Chatwork」Android版では、モジュール分割の過程で:feature:commonモジュールが大 きくなってきました。 本発表では、 - :x:commonモジュールを小さく保つためにどうすればいいのか - 大きくなった:x:commonモジュールを小さくするためにどうすればいいのか という2つの観点で、考えたこと・実践したことを話します。
:x:commonモジュールを 小さく保つ
:x:commonモジュールにコードを書かなければ、:x:commonモジュールは小さいまま。 そのためには、以下のことを考えるのが良いと思う。 - コードの重複を恐れない - サブモジュールの分割単位を考え直す :x:commonモジュールを小さく保つ
- :x:commonに共通コードを置き、共通コードを:xの各サブモジュールが参照している場 合、複数のサブモジュールに対して同時に変更が影響する。 - 共通コードを使用しているすべての箇所に、共通コードの変更が影響する。 - 共通コードの変更が各サブモジュールに影響することが嬉しいか、嬉しくないかを 考える。嬉しくないなら、コードの重複(コピペ)を許容した方がいいかもしれな い。 -
コードの重複と引き換えに、開発速度を得られる可能性がある。 コードの重複を恐れない
- :x:commonに置いた共通コードが特定の複数のモジュールからのみ参照されていて、か つ常にそれらのモジュールへ同時に変更を適用したいのであれば、それらのモジュール はひとつのモジュールであるべきなのかもしれない。 - 本来、ひとつのモジュール内で結合しているべきコードなのかもしれない。 - そうであれば、分割したモジュールをあえて統合すべきかもしれない。 サブモジュールの分割単位を考え直す
例えば、画面Aと画面Bで同じに見える部品が使われていたとする。 :x:commonモジュールを小さく保つ:具体例 画面A 画面B
これらが違うように変更されていくなら、それぞれのモジュールにコードをコピペした方が 開発速度が出るかもしれない。 :x:commonモジュールを小さく保つ:具体例 画面A 画面B
これらが同じように変更されていくなら、そもそもこれらの画面を同じモジュールに入れる べきなのかもしれない。 :x:commonモジュールを小さく保つ:具体例 画面A 画面B
大きくなった:commonモジュールを 小さくする
単に:x:common:sub-1、:x:common:sub-2、...と増やしていくという話ではない。 依存関係の組み合わせを考えることは避けたいし、commonモジュールを使う側がいちいち 依存関係を考えないといけないのではcommonモジュールの意味がない。 大きくなった:x:commonモジュールを小さくする
:x:commonモジュールを必要としているモジュールが本当に必要なのは、:x:commonモ ジュールの持つ抽象のはず。 大きくなった:x:commonモジュールを小さくする
モジュール単位で依存関係逆転原則を適用して、モジュール間の依存関係の向きを制御でき る。:x:commonの具象をサブモジュールに移して、具象と抽象を切り離すことができる。 大きくなった:x:commonモジュールを小さくする
:xモジュールの各サブモジュールからは、:x:commonモジュールのみを参照すれば良い。綺 麗なモジュール間の依存関係が手に入る。 大きくなった:x:commonモジュールを小さくする
あくまで「:x:commonモジュールが大きくなってきた時に使えるかもしれない」程度の方 針。 :x:commonをサブモジュールに分けなくて済むのであれば、分けなくて良い。 大きくなった:x:commonモジュールを小さくする
まとめ
- アプリの規模(コードのサイズ、メンバーやチームの数)が大きくなるに従って、アプ リのモジュール分割から大きなメリットが得られるようになる。 - モジュールをさらにサブモジュールに分ける時、共通コードを置くためのモジュールが 必要になる場合がある。 - :xモジュールの共通コードの置き場となる:x:commonモジュールが大きくなると、モ ジュール分割から得られるはずのメリットが得られなくなる可能性がある。 -
:x:commonモジュールを小さく保つ。 - コードの重複を恐れない。 - サブモジュールの分割単位を考え直す。 - 依存関係逆転原則を用いて、:x:commonをサブモジュールに分割できる場合もある。 - 分割しないで済むなら分割しなくて良い。 まとめ