Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

    View Slide

  2. 2
    @shinmiy
    Android Engineer @ Merpay

    View Slide

  3. この物語はフィクションです。

    実在の人物・団体・事件とは

    一切関係ありません。


    View Slide

  4. 4
    〜2016

    View Slide

  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

    View Slide

  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

    View Slide

  7. 7

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. 11

    View Slide

  12. 12

    View Slide

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

    View Slide

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

    View Slide

  15. 15

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  23. 23

    View Slide

  24. 24

    View Slide

  25. 25

    View Slide

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

    View Slide

  27. 27

    View Slide

  28. 28

    View Slide

  29. 29

    View Slide

  30. 30

    View Slide

  31. 31

    View Slide

  32. 32

    View Slide

  33. 33

    View Slide

  34. 34

    View Slide

  35. 35
    git checkout .

    View Slide

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

    View Slide

  37. 37
    git checkout .
    🤔

    View Slide

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

    View Slide

  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()
    }
    }
    }
    }

    View Slide

  40. 40

    View Slide

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

    View Slide

  42. 42
    🍵

    View Slide

  43. 43

    View Slide

  44. 44

    View Slide

  45. 45

    View Slide

  46. 46

    View Slide

  47. 47

    View Slide

  48. 48

    View Slide

  49. 49

    View Slide

  50. 50

    View Slide

  51. 51

    View Slide

  52. 52

    View Slide

  53. 53

    View Slide

  54. 54

    View Slide

  55. 55

    View Slide

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

    View Slide

  57. 57

    View Slide

  58. 58

    View Slide

  59. 59
    Hindsight is 20/20

    View Slide

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

    View Slide