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
410
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
350
カンファレンス参加をいかに正当化するか
okuzawats
0
300
「勉強になった」で終わらせない、ストロングスタイルの勉強会
okuzawats
0
400
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
620
Kotlinのifを愛でる
okuzawats
0
690
Other Decks in Programming
See All in Programming
大規模アプリのDIフレームワーク刷新戦略 ~過去最大規模の並行開発を止めずにアプリ全体に導入するまで~
mot_techtalk
1
450
ソフトウェア設計の実践的な考え方
masuda220
PRO
4
590
バッチ処理を「状態の記録」から「事実の記録」へ
panda728
PRO
0
160
kiroとCodexで最高のSpec駆動開発を!!数時間で web3ネイティブなミニゲームを作ってみたよ!
mashharuki
0
480
他言語経験者が Golangci-lint を最初のコーディングメンターにした話 / How Golangci-lint Became My First Coding Mentor: A Story from a Polyglot Programmer
uma31
0
160
Six and a half ridiculous things to do with Quarkus
hollycummins
0
170
Claude Agent SDK を使ってみよう
hyshu
0
360
デミカツ切り抜きで面倒くさいことはPythonにやらせよう
aokswork3
0
240
Server Side Kotlin Meetup vol.16: 内部動作を理解して ハイパフォーマンスなサーバサイド Kotlin アプリケーションを書こう
ternbusty
3
190
dynamic!
moro
10
8k
2分台で1500examples完走!爆速CIを支える環境構築術 - Kaigi on Rails 2025
falcon8823
3
3.7k
iOSエンジニア向けの英語学習アプリを作る!
yukawashouhei
0
190
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
75
5.1k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Become a Pro
speakerdeck
PRO
29
5.5k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.5k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
For a Future-Friendly Web
brad_frost
180
9.9k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
33
2.3k
Rails Girls Zürich Keynote
gr2m
95
14k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.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をサブモジュールに分割できる場合もある。 - 分割しないで済むなら分割しなくて良い。 まとめ