プログラムの読み易さに影響を与えそうなこと
最近気をつけているというか、興味を持っているというか、 この辺に気を配ると、ぐんとプログラムが読みやすくなるよなあ、というもの。
- ガード節的な条件文
- 一時変数が出てきたら関数への分割を考える
- 戻値は真偽値ではなくオブジェクトにする
- メソッドチェインが使えないか考える
ガード節的な条件文
関数の頭のところに、先に進むかreturnするかの分岐を書くというテクニック。 本来の意味のガード節だと、returnするのは特殊な場合で、 通常は先に進むというニュアンスがあるのだけど、 あんまり気にしなくていいかなあ、と思ってるので、ガード節「的」としました。
function hoge()
{
if (条件式) {
なんかの処理が
数行続く
そんなブロック
}
}
だと、ifの中のブロックに入らなかった場合はどうするのかなあ、 と考えながらコードを読む必要があるのですが、
function hoge()
{
if (! 条件式) {
return;
}
なんかの処理が
数行続く
そんなブロック
}
なら、ああこれで終わりなのね、とすぐわかるので読みやすいと。
一時変数が出てきたら関数への分割を考える
function hoge()
{
$tmp1 = fuga1();
$tmp2 = fuga2($tmp1);
$tmp3 = fuga3($tmp2);
$tmp3を使うなんかの処理が
数行続く
そんなブロック
}
これだと$tmp1や$tmp2を後で使うのかなあ、と考えながら読む必要があるので、
function hoge()
{
$tmp3 = getTmp3()
$tmp3を使うなんかの処理が
数行続く
そんなブロック
}
function getTmp3()
{
$tmp1 = fuga1();
$tmp2 = fuga2($tmp1);
return fuga3($tmp2);
}
とします。 一時変数があるということは、コードの記述量もそれなりにありそうだし。
戻値は真偽値ではなくオブジェクトにする
何か処理をして、成功したらtrue, 失敗したらfalseを返すってのは 割と定番なんですけど、 成功・失敗の2つしかないと思ってたら、 実はもっとパターンがあった、となると困るので、 最初からオブジェクトにしておきましょう、みたいな感じですね。
class Result()
{
public $success = false; // 成功
public $fail = false; // 失敗
public $canceled = false; // 意図的に中止された
public $duplicate = false; // 重複になるから途中で中止した
}
みたいに、パターンを増やすことができます。
メソッドチェインが使えないか考える
DB的なものからある条件でデータを取得し、 ソートしたり、ランダムに並び換えたりする、みたいな流れだと、
$data = $hoge->select(取得条件, OPTION_FLAG_SORT);
$data = $hoge->select(取得条件, OPTION_FLAG_SHUFFLE);
という手もあるんですけど、実装が許すなら
$data = $hoge->select(取得条件)->sort();
$data = $hoge->select(取得条件)->shuffle();
と書きたい。 これは$hogeのクラスやselect関数の肥大化を避けるという効果があるのだけど、 そこまでの説得力はないかなあ、と思います。 要は好みの問題なんじゃないの、と言われたらそれまで。