プログラミングの勉強で「処理は関数にまとめる」ということが書いてあります。自分も仕事でコードを書くとコードレビューで「処理は関数にまとめてください」とか「コードの見通しが悪いです」とかレビューされます。コード見通し?ってなんのことか最初よくわからなかったです。

例として関数にまとめないコード例は下記になります。内容はとりあえず無視してください。

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        DaggerMainActivityComponent.factory()
                .create(this, this)
                .inject(this)
        super.onCreate(savedInstanceState)

        viewBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(viewBinding.root)

        /**
         * 
         * 通知チャネルを作成処理
         * 8行
         *
         */
        /**
         * 
         * ブロードキャストIntent宣言処理
         * 6行
         *
         */
        /**
         * 
         * 広告の初期化処理
         * 2行
         *
         */
        /**
         * 
         * Actionbarの初期化処理
         * 2行
         *
         */
        /**
         * 
         * NavigationDrawerの初期化処理
         * 10行
         *
         */
        /**
         * 
         * InAppUpdates確認処理
         * 7行
         *
         */
        /**
         * 
         * LiveDataを観測する処理
         * 6行
         *
         */
        /**
         * 
         * LiveDataを観測する処理
         * 6行
         *
         */
        /**
         * 
         * 初回起動時の処理
         * 2行
         *
         */
    }
}

こういうコードをそのまま書いている人いませんか?1つの関数に30行も40行も書かれると読む側の人はとても大変です。通常の場合、コードは上から実行されるので実装者もレビュワーもコードは基本的に上から見ていきます。例えばLiveDataを観測する処理にバグが入っているとわかってはいるが、修正をしようとすると上から順番にコードを読むため、40行ほどのコードを読まないといけません。人間の頭の中のメモリは限られているので、目的の場所に素早く到着し、余計な情報は入れないでバグを修正したいです。そのために処理を関数に分けます。

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        DaggerMainActivityComponent.factory()
                .create(this, this)
                .inject(this)
        super.onCreate(savedInstanceState)

        viewBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(viewBinding.root)

        createNotificationChannel()
        registerPackageAddedReceiver()
        setupAd()
        setupActionBar()
        setupNavigationDrawer()
        checkInAppUpdates()
        observeViewModel()
        loadIsFirstLaunch()
    }

    private fun createNotificationChannel() {}
    private fun registerPackageAddedReceiver() {}
    private fun setupAd() {}
    private fun setupActionBar() {}
    private fun setupNavigationDrawer() {}
    private fun checkInAppUpdates() {}
    private fun observeViewModel() {}
    private fun loadIsFirstLaunch() {}
}

このコードを上から読んでLiveDataの観測処理に辿り着くには15行ほどのコードを見て、observeViewModel()関数にコードジャンプすれば目的のコードが見れます。このように関数を分けることで目的のコードに辿り着く手間が格段に少なくなります。見るべきファイルが多ければ多いほど関数を分ける意味がボディーブローのようにジワジワ聞いてきます。パッと見てなんのコードが書かれているかわからないコードは見通しが悪いので関数にわけましょう。