blog.fuktommy.com

プログラムの読み易さに影響を与えそうなこと

最近気をつけているというか、興味を持っているというか、 この辺に気を配ると、ぐんとプログラムが読みやすくなるよなあ、というもの。

ガード節的な条件文

関数の頭のところに、先に進むか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関数の肥大化を避けるという効果があるのだけど、 そこまでの説得力はないかなあ、と思います。 要は好みの問題なんじゃないの、と言われたらそれまで。

Copyright© 1998-2014 Fuktommy. All Rights Reserved.
webmaster@fuktommy.com (Legal Notices)