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 full-size slide

  2. 2
    @shinmiy
    Android Engineer @ Merpay

    View full-size slide

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

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

    一切関係ありません。


    View full-size slide

  4. 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 full-size slide

  5. 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  19. 35
    git checkout .

    View full-size slide

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

    View full-size slide

  21. 37
    git checkout .
    🤔

    View full-size slide

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

    View full-size slide

  23. 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 full-size slide

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

    View full-size slide

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

    View full-size slide

  26. 59
    Hindsight is 20/20

    View full-size slide

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

    View full-size slide