$30 off During Our Annual Pro Sale. View Details »

長期運用アプリのリファクタリングを考える

shinmiy
October 05, 2022

 長期運用アプリのリファクタリングを考える

Android始まって以来の大きな転換期を迎えている今、リリースしてから年月が経過している長期運用アプリの中にはそろそろ構造的に無理が生じているものも増えてきているのではないでしょうか?

Jetpack Composeが発表され、アプリアーキテクチャガイドでベストプラクティスが案内されていますが、試行錯誤を繰り返しながら運用しているアプリではなかなかついていくことに苦労することも多いです。運用中のアプリの開発を止めるわけにはいかずフルスクラッチという選択肢が取れないこともあるでしょう。

このセッションでは
- ゴッドアクティビティが乱立しているアプリの分解方法
- 段階的なJetpack Compose化
- リファクタリングにおける効率的なAndroid Studioの使い方
など、アプリのアーキテクチャの方向性が明確化してきた中で長期運用しているアプリをリフレッシュする方法を考えます

shinmiy

October 05, 2022
Tweet

More Decks by shinmiy

Other Decks in Programming

Transcript

  1. 長期運用アプリの リファクタリングを考える @shinmiy Oct 5, 2022 / DroidKaigi 2022 Day

    1 1
  2. 2 @shinmiy Android Engineer @ Merpay

  3. この物語はフィクションです。
 実在の人物・団体・事件とは
 一切関係ありません。


  4. 4 〜2016

  5. 5 2017/2018 What's new in Kotlin 1.3 https://kotlinlang.org/docs/whatsnew13.html Android and

    Architecture https://android-developers.googleblog.com/2017/05/android-and-architecture.html
  6. 6 2021 Jetpack Compose is now 1.0: announcing Android’s modern

    toolkit for building native UI https://android-developers.googleblog.com/2021/07/jetpack-compose-announcement.html Rebuilding our guide to app architecture https://android-developers.googleblog.com/2021/12/rebuilding-our-guide-to-app-architecture. html
  7. 7

  8. 8 改善が必要な アプリとは?

  9. 9 今後の変更に対応することが 難しくなってきたアプリ

  10. 10 サービスやチームにも様々な変化: • 担当者が変化 ◦ 人の出入りがある • 仕様が変化 ◦ リリース当初の想定から大きく変化

  11. 11

  12. 12

  13. 13 今後の変更に対応することが 難しくなってきたアプリ 機能開発しづらい😩 コードの 学習コストが高い😩 開発者の モチベーション😩

  14. 14 アーキテクチャがしっ かりしていて、忠実に 守られている 仕様が明確で 変化が少ない 長期運用 != 改修が必要

  15. 15

  16. 16 今後の変更が しやすいアプリを 目指す

  17. 17 アプリ アーキテクチャ ガイド https://developer.android.com/topic/architecture

  18. 18 メリット • ベストプラクティスとして無理がない コミュニティとの対話の末できたもの。今の環境を反映していて、最終的には開発者が判断 • 共通言語ができた 同じ前提を共有できて関連する知見が溜まりやすくなった。オンボーディングもしやすい

  19. 19 メリット • ベストプラクティスとして無理がない コミュニティとの対話の末できたもの。今の環境を反映していて、最終的には開発者が判断 • 共通言語ができた 同じ前提を共有できて関連する知見が溜まりやすくなった。オンボーディングもしやすい

  20. 20 UI アプリ開発ツールキット Jetpack Compose https://developer.android.com/jetpack/compose

  21. 21 Navigating with Compose / Navigate with arguments https://developer.android.com/jetpack/compose/navigation#nav-with-args

  22. 22 アプリアーキテクチャガイドに沿った設計 + Jetpack Compose

  23. 23

  24. 24

  25. 25

  26. 26 1回目 理解のため 2回目 整理のため 3回目 コミットのため

  27. 27

  28. 28

  29. 29

  30. 30

  31. 31

  32. 32

  33. 33

  34. 34

  35. 35 git checkout .

  36. 36 1回目 理解のため 2回目 整理のため 3回目 コミットのため

  37. 37 git checkout . 🤔

  38. 38 1回目 理解のため 2回目 整理のため 3回目 コミットのため

  39. 39 xx xx xx xx xx xx xx xx xx

    xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx class FooActivity: Activity { override fun onCreate() { doHoge() doFuga() } override fun onDestroy() { doHuga() } private fun doHoge() { why.are = you.reading the.fine.print() if (theres.nothing) { here.to(see) } } private fun doFuga() { db.hoge { result -> if (result.isSuccessful) { val builder = AlertDialog.Builder(this) builder.setTitle(R.string.submit_dialog_title) builder.setMessage(R.string.submit_dialog_message) builder.setPositiveButton(R.string.ok) { p0, p1 -> Logger.log(SubmitLog()) val message = R.string.submit_complete Toast.makeText(this, message, Toast.LENGTH_LONG) .show() finish() } } } } } xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx class FooActivity: Activity { override fun onCreate() { doHoge() doFuga() } override fun onDestroy() { doHuga() } private fun doHoge() { why.are = you.reading the.fine.print() if (theres.nothing) { here.to(see) } } private fun doFuga() { db.hoge { result -> if (result.isSuccessful) { this.showDialog() } else { finish() } } } }
  40. 40

  41. 41 集中して一度のセッション で終わらせる

  42. 42 🍵

  43. 43

  44. 44

  45. 45

  46. 46

  47. 47

  48. 48

  49. 49

  50. 50

  51. 51

  52. 52

  53. 53

  54. 54

  55. 55

  56. 56 Navigating with Compose / Navigate with arguments https://developer.android.com/jetpack/compose/navigation#nav-with-args

  57. 57

  58. 58

  59. 59 Hindsight is 20/20

  60. 60 ありがとうございました!