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
okuzawats
December 20, 2024
Programming
1
430
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
400
カンファレンス参加をいかに正当化するか
okuzawats
0
320
「勉強になった」で終わらせない、ストロングスタイルの勉強会
okuzawats
0
420
10年モノのAndroidアプリのコード品質を改善していく、3つの取り組み
okuzawats
0
1.3k
Androidアプリ開発におけるSonarCloudの活用
okuzawats
0
1.2k
何故、UseCaseは1メソッドなのか
okuzawats
3
2.1k
例外を投げるな、値を返せ
okuzawats
9
8.1k
GitHub ActionsでAndroidアプリのテストを回しまくってたら全プロジェクトのCI/CDが完全停止する寸前だった件
okuzawats
0
650
Kotlinのifを愛でる
okuzawats
0
980
Other Decks in Programming
See All in Programming
The Art of Re-Architecture - Droidcon India 2025
siddroid
0
160
AIエージェントの設計で注意するべきポイント6選
har1101
6
2.9k
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
700
re:Invent 2025 トレンドからみる製品開発への AI Agent 活用
yoskoh
0
570
それ、本当に安全? ファイルアップロードで見落としがちなセキュリティリスクと対策
penpeen
4
1.4k
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
240
Grafana:建立系統全知視角的捷徑
blueswen
0
270
実はマルチモーダルだった。ブラウザの組み込みAI🧠でWebの未来を感じてみよう #jsfes #gemini
n0bisuke2
3
1.4k
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
1
210
Denoのセキュリティに関する仕組みの紹介 (toranoana.deno #23)
uki00a
0
210
CSC307 Lecture 01
javiergs
PRO
0
650
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
620
Featured
See All Featured
Google's AI Overviews - The New Search
badams
0
880
The World Runs on Bad Software
bkeepers
PRO
72
12k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
1
340
Java REST API Framework Comparison - PWX 2021
mraible
34
9.1k
A Tale of Four Properties
chriscoyier
162
23k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
74
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
39
The #1 spot is gone: here's how to win anyway
tamaranovitovic
1
880
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Building an army of robots
kneath
306
46k
Getting science done with accelerated Python computing platforms
jacobtomlinson
0
88
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
54
48k
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をサブモジュールに分割できる場合もある。 - 分割しないで済むなら分割しなくて良い。 まとめ