ThoughtWorksアンソロジー」を購入したので、以前デブサミ2009で聞いた「オブジェクト指向エクササイズ」をやってみようと思っている。PHPでwebを作るときどの程度応用できるかにも興味があった。

同じころ。とある機能に仕様追加があったので、他人がずいぶん前に書いた箇所に手を入れる必要が出てきた。当該箇所を探り当て、ソースコードを開いて気絶しそうになった。

な、なんじゃこりゃ。

先日勉強会で「ダメコードをdisる」というそれはそれは悪意のあるテーマを取り上げたのだが、そっちのネタにすればよかった、と思うぐらいのコードが綴られていた。

ちょっと書き足す予定が大幅にリファクタして、やっと機能追加も完成し、私の心も(ほんの少し)晴れやかになった。そんなコードを二度と書かない / 書かせないために、「オブジェクト指向以前エクササイズのススメ」を提唱してみる。

注:
以下、とてもレベルの低いエクササイズが続きます。御用とお急ぎでない方のみ続きをどうぞ。

オブジェクト指向以前エクササイズ

  1. リテラルをハードコードしたらうさぎ跳び

    <?php
    if ($status == )               // 0はどういう意味?成功?
    {
        $insentive = 650 ;          // 650って報酬額?変更したいときはここ?
        $dao->addInsentive($user[‘id’], $insentive) ;
    }
    ?>

  2. 漏れる条件分岐書いたら腹筋

    <?php
    // 「汎用イベントリスナ」とコメントしてあった
    if ($status == )          // またリテラルだよ
    {
        if ($event_id == 123// こっちもリテラル
        {
            // do_something
        }
        if ($event_id == 456)
        {
            // do_somethingelse
        }
        // あれ?条件式終わり?$event_idは絶対に増えないの?
    }
    ?>

  3. 適用ケースが2/15,000なのに「汎用」とかコメントしたら腕立て伏せ

    – さっきの処理のデータソースを数えてみた
    some_database=# SELECT COUNT(event_id) FROM events ;
    count
    ——-
    14987
    (1 row)

  4. 状態遷移を保存する変数を「$statu」と命名したら空気椅子

    <?php
    // 変数定義
    $statu = ;

    // 中略

    // パラメータチェック
    if (empty($_GET[‘some_id’]))
    {
        $status = 1;
    }
    // 粗忽すぎる…
    ?>

ソースコード2本、200行弱をざっと読んだだけでこれだけツッコミどころがあるなんて…とかなり暗澹たる気持ちになった。

本物の「オブジェクト指向エクササイズ」は「オブジェクトの広場」で公開されている。御用とお急ぎの方も、こちらはぜひご一読を。

そして恐ろしいことに、次はassertが山ほど仕込まれたPHPコードと向き合わねばならない。「Debug Hacks」購入記念「デバッグスキルエクササイズのススメ」をやる必要がありそうだ。

OGIS-RI OBJECT SQUARE

http://www.ogis-ri.co.jp/otc/hiroba/

Developers Summit 2009 参加報告

http://www.ogis-ri.co.jp/otc/hiroba/Report/Developers_Summit2009/index.html