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
73
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
180
カンファレンス参加をいかに正当化するか
okuzawats
0
200
「勉強になった」で終わらせない、ストロングスタイルの勉強会
okuzawats
0
320
10年モノのAndroidアプリのコード品質を改善していく、3つの取り組み
okuzawats
0
1.1k
Androidアプリ開発におけるSonarCloudの活用
okuzawats
0
940
何故、UseCaseは1メソッドなのか
okuzawats
3
1.7k
例外を投げるな、値を返せ
okuzawats
9
7.7k
GitHub ActionsでAndroidアプリのテストを回しまくってたら全プロジェクトのCI/CDが完全停止する寸前だった件
okuzawats
0
470
Kotlinのifを愛でる
okuzawats
0
420
Other Decks in Programming
See All in Programming
急成長期の品質とスピードを両立するフロントエンド技術基盤
soarteclab
0
920
Zoneless Testing
rainerhahnekamp
0
120
42 best practices for Symfony, a decade later
tucksaun
1
180
良いユニットテストを書こう
mototakatsu
4
1.7k
The Efficiency Paradox and How to Save Yourself and the World
hollycummins
1
440
Full stack testing :: basic to basic
up1
1
930
ブラウザ単体でmp4書き出すまで - muddy-web - 2024-12
yue4u
2
460
layerx_20241129.pdf
kyoheig3
2
290
短期間での新規プロダクト開発における「コスパの良い」Goのテスト戦略」 / kamakura.go
n3xem
2
170
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
180
Stackless и stackful? Корутины и асинхронность в Go
lamodatech
0
640
第5回日本眼科AI学会総会_AIコンテスト_3位解法
neilsaw
0
170
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.9k
We Have a Design System, Now What?
morganepeng
51
7.3k
Building Applications with DynamoDB
mza
91
6.1k
GraphQLとの向き合い方2022年版
quramy
44
13k
Writing Fast Ruby
sferik
628
61k
Building an army of robots
kneath
302
44k
Fireside Chat
paigeccino
34
3.1k
What's in a price? How to price your products and services
michaelherold
243
12k
Documentation Writing (for coders)
carmenintech
66
4.5k
RailsConf 2023
tenderlove
29
940
Become a Pro
speakerdeck
PRO
26
5k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.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をサブモジュールに分割できる場合もある。 - 分割しないで済むなら分割しなくて良い。 まとめ