出社。苦闘する。ここ一ヶ月ぐらいリファクタに取り組んでいる。方針は事前に決まっていて自分は決まったことをやるだけ。今までのタスクは単純なものだった。いらないコードを消したり、テスト書いたりしてればよかった。しかし、今回のタスクは複数の実装に手を入れて処理の重複をなくすというもの。
やることはいっぱいあった。まずは仕様を洗い出してドキュメントにするところからはじめて(なかったので)、次に洗い出した仕様を元にテストを新しく書き(なかったので)、やっと実装を触れる気がしてきた。先週あたりはずっとドキュメントを書いていて、今日テストまで書けた。
で、明日からどうするかだが、とにかくこういうときに肝に命じなければならないのは、一番簡単にやれることから始めるということだ。最終的な目的は4つぐらいの関数の共通化だが、いきなり複数の処理を抽象化したコードを書き始めることはできない。こういうときは一番手前にあるステップから進んでいく必要があり、そしてそれはコピペだと思う。
関数Aと関数Bがあるとする。この2つの処理はかなり似ているが、それなりに巨大であり、内部では別々の関数を呼び出していてまったく共通化されていない。まずワシのような一般人が思いつくのは、関数Aから処理をコピーしてきて関数Bの同じことをやってそうな部分にペーストし、どこが壊れるか見るということだ。コピーしてくる処理はサブの処理も含めて全部インラインに展開してあるとわかりやすい。
このときにテストが役立つ。壊れなければラッキー。それらは同じ関数に括り出せる。壊れたら全ては共通化できなかったことになる。じゃあどこまでなら共通化可能か、ということで範囲を絞り込んでいく。その後、この作業を通じて得られた共通処理を関数 C にも適用できないか試してみる。
で、別のトピックとしてこのアプリがレイヤードアーキテクチャ風味って問題もあるのよな。どのレイヤで何が行われてるのか、一ヶ月経ったがいまだに馴染めてないという問題があり、、、ここも図を作ったほうがいいなぁ。関数がどのレイヤで呼び出されてて、何に詰め替えしてて、ってのが分かるように。コールグラフ?みたいなやつ。
自分がまったく触ったことないコードのリファクタリングをするってのが初めてすぎて、なかなか大変である。適切に図を書くとか分割統治するとかして脳味噌のメモリ量を落とさないとすぐ情報量に圧倒されてしまう。(そして、ワシはいったいなぜこんなことを・・・?)