どっこと備忘録群

アウトプットしないとインプットできない私が Androidアプリ開発をメインとした備忘録を載せています。

DroidKaigi 2022 - 長期運用アプリのリファクタリングを考える | shinmiy [JA] を視聴した

視聴元

アーキテクチャに関する歴史

2016年ごろまで

  • アーキテクチャは実装者任せ。
  • GoogleはOSの機能開発に徹する。
  • それをどう使うかは開発者におまかせ

2017/2018年

  • Googleがアーキテクチャの指針を公開
  • Kotlinや Kotlin Coroutine が公開

2021年

  • より詳細なアーキテクチャガイドの発表
  • その大きな変化の中、それを生き延びてきたアプリがある。長期運用されてきたアプリをどうやって適用させていくべきか。

改善の対象となるもの

技術的負債がたまって、今後の対応が難しくなってきたアプリ

  • 担当者の変化
  • 仕様の変化

その結果生まれるコード

  • GodActivity
  • マルチアーキテクチャ

それにより

  • 機能開発の高難度化
  • コードの学習コスト高
  • 開発者のモチベーション低下

改修すべきじゃないもの

  • アーキテクチャが忠実に守られている
  • 仕様が明確で変化が少ない

「今後の変更がしやすいアプリ」を目指すために

アーキテクチャガイド

  • ベストプラクティスとして無理がない
  • 共通言語ができた
  • 関連する知見が共有しやすくなった

JetpackCompose

  • 今後はこれに代わる

しかし、一気にやると無理が生じる

  • 例えば画面単位/機能単位でやるとよさそう。
  • それにあたって大きく3つのフェーズがある。
  • 理解・整理フェーズ
  • 分離フェーズ
  • 置き換えフェーズ

理解・整理フェーズ

元のコードに対する理解・整理。3回のリファクタリングを経て実施。

1回目:理解のためのリファクタリング

  • ASの力をふんだんに使う
  • 理解が進んだら、全部飛ばす

2回目:整理のためのリファクタリング

  • やることは1回目と似ているが理解を前提として

3回目:コミットのため

  • 丁寧にコミットするためのリファクタリング

集中して1回のセッションで終わらせる(短期集中)

  • あとで「何やってたんだっけ」
  • 熱量の変化(低下)

分離フェーズ

  • 関心の分離を意識しつつ、リファクタリングしたコードで分離できるものを分離
  • データレイヤから引き離していくと個別にテストしやすい・変更しやすい
    • 例:サーバ通信
    • 例:アプリ内DB
  • もしくはフルスクラッチでデータレイヤを追加して徐々にそちらにシフト

置き換えフェーズ

Activityによる画面遷移の場合、JetpackComposeにいきなりシフトするのは難しい

  • 段階を踏んで取り入れることで無理なく置き換える
  • 極力ペイロードを減らすとあとあと嬉しい

最後に

  • 前任者を絶対にディスらない!!!
  • 今のコードは価値や利益を生んでいるコード。今のコードとなった背景や起因などがあったはず。

最終更新: 2025.6.17