Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Androidアプリのモジュール分割における:x:commonを考える
Search
okuzawats
December 20, 2024
Programming
1
420
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
380
カンファレンス参加をいかに正当化するか
okuzawats
0
310
「勉強になった」で終わらせない、ストロングスタイルの勉強会
okuzawats
0
410
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
640
Kotlinのifを愛でる
okuzawats
0
880
Other Decks in Programming
See All in Programming
生成AIを利用するだけでなく、投資できる組織へ
pospome
1
320
Full-Cycle Reactivity in Angular: SignalStore mit Signal Forms und Resources
manfredsteyer
PRO
0
210
안드로이드 9년차 개발자, 프론트엔드 주니어로 커리어 리셋하기
maryang
1
110
AIコーディングエージェント(skywork)
kondai24
0
160
AIエンジニアリングのご紹介 / Introduction to AI Engineering
rkaga
5
2.1k
【CA.ai #3】Google ADKを活用したAI Agent開発と運用知見
harappa80
0
300
Canon EOS R50 V と R5 Mark II 購入でみえてきた最近のデジイチ VR180 事情、そして VR180 静止画に活路を見出すまで
karad
0
110
大体よく分かるscala.collection.immutable.HashMap ~ Compressed Hash-Array Mapped Prefix-tree (CHAMP) ~
matsu_chara
2
220
Rediscover the Console - SymfonyCon Amsterdam 2025
chalasr
2
160
俺流レスポンシブコーディング 2025
tak_dcxi
14
8.6k
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
150
tparseでgo testの出力を見やすくする
utgwkk
1
210
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.1k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
Building Applications with DynamoDB
mza
96
6.8k
YesSQL, Process and Tooling at Scale
rocio
174
15k
The Cost Of JavaScript in 2023
addyosmani
55
9.3k
GraphQLとの向き合い方2022年版
quramy
50
14k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
1
100
Balancing Empowerment & Direction
lara
5
800
Writing Fast Ruby
sferik
630
62k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
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をサブモジュールに分割できる場合もある。 - 分割しないで済むなら分割しなくて良い。 まとめ