今日は一日中リファクタリングをしつつ、多少の機能追加をしていました。
まぁ、この機能追加もリファクタリングの一環なんですけどね。ただ、今日一日でソースコードの行数が約120行ぐらい減りました。明らかに重複してたのを頑張って統合したので。(笑)
この作業は後々の機能追加を容易にするためにも手を抜かず、将来のことも考えつつやっていかねばなりません。既に出来上がっている機能を壊さないようにするだけの作業なので、正直やっててもそんな楽しくはないんですが、出来上がったコードを見ると楽しいですね。(笑)
ちなみに、リファクタリング時にとっても使えるなぁと思ったのは
デフォルト引数値を使うことですね。
関数の引数の数って絶対的なもので、オーバーロードとかしない限り無理だと思ってて、オーバーロード不能なPHPだと引数の数を最初から決めておかないといけないと思ってたんですね。
ただ、Laravelのソースコードとか見てると、このデフォルト引数値が設定されてる関数とかありまして、調べてみるとこの事実にたどり着いたわけですね。
このデフォルト引数値を使うことで何が嬉しいかって
挙動は殆ど同じだけど追加のパラメータがたまに必要なメソッドを統合できることです。
これは今までデフォルト引数値の値を最初から引数として渡すことで実装していたのですが、これは思いつきでの機能追加がすごいしにくいんですね。ただ、基本となる動きをデフォルト引数値として設定し、基本は引数なしで呼び出すことで、デフォルトの挙動を維持しつつ、必要に応じて引数を渡せばそれがオプショナルな挙動を再現できるわけです。
例えば、最も基本となるであろうタイムラインデータの取得だとこんな感じに実装していたりします。引数なしで呼び出すとトップページの表示そのままに、第一引数は追加ロードする時に必ず必要になる取得済みIDの値を渡します。第二引数は動作モードのようなものですね。これを設定する時で第一引数が要らない時はnullにしておけば良いです。これはそんなに混乱を生むような実装じゃないと思ってます。
実はソート周りはちょっとよくない実装している気がしますが、他に上手い方法が思いつかないのでMySQLの処理能力を信じてこのまま突き進むことにします。(笑)
ちなみにリファクタリング前はこんな感じの関数になってました。
(昨日はこれよりさらにもうちょっと長かったんですよね)
無駄を削ぎ落とすってのは気持ちのよいものです。が、できることなら最初からちゃんと設計して、無駄のないコードにしておけば良かったですね。
本来のテスト駆動開発は、こういうのに気付き次第修正していくものだったのですが
ろんぐさんがめんどくさがって放置した結果余計ややこしくなってしまったので、反省ですね。
明日明後日も
研究を放置してこの作業を続けようかなと思います。