他人にこの話をすることはほとんどない。自転車置き場のそしりは免れ得ないとおもう。とはいえもしあなたがプログラミング初心者で、僕に何かアドバイスできることがあるならちょっと見ていってほしい。へぼプログラマーの僕があなたにあげられるものはこんなものしかない。この記事を上級者のところに持って言ったらきっとこういうだろう。「……まあ、やったほうがいいかやらないほうがいいかでいえば、51:49でやったほうがいいと思うよ……」と。
というわけで長いFor文を縦に分割する話をする。For文のネストが深くならないようにする話は後日する。
あなたがTwitterのようなものを作っているとしよう。タイムラインを取得するAPIだ。自分がフォローしているユーザーの投稿と、その人がRTした投稿を取得することにする。
このようなコードになった。
- 一番外側のループでユーザーを一人ずつ見て行く
- そのユーザーをフォローしているか判定
- そのユーザーの投稿を抽出
- そのユーザーがRTした投稿を抽出
例が簡単すぎたのであまりメリットが見えてこないかもしれない。スマソ。
ここでFor文を縦に分割してみよう。処理が二つの山にまとまった。
しかし、まだ問題がある。フォロワーかどうかを判定する式が重複している。そこでフォロワーだけを抽出した配列を作ってしまおう。
まずフォローしているユーザーを配列に抽出してから続きの作業をする
見やすくなったと思う。最後にここから山を一個ずつ別の関数に移していこう。
ちなみにFor文の中で三つの関数を呼び出してもいい。どっちでもいいが、前者のほうが要所要所で値が確定しているのでデバッガブルでいいのではと思う。あと、もっとFor文の中が複雑になってきた場合一つのForの中に複数の処理があるとcontinueやbreakに起因するバグの可能性が一個増える。強要はしません。
ここからさらに一歩。どうしたら最初からこういう綺麗なコードを書けるようになるか。まず、変数を用意したら定義していない関数を呼び出して値を代入する。するとIDEで警告が出る。多くのIDEには未定義関数の呼び出しから関数を生成するショートカットキーが用意されている。その後関数の中身を書いていく。
今回のコードであればこうだ。無意識に意味とまとまりとコードのまとまりが対応したコードになる。
補足
多くの言語の配列には.filterや.mapのような便利な関数が用意されているので、それを使いこなせるようになるともっといいです。