「オブジェクト指向以前エクササイズのススメ」を提唱する
「ThoughtWorksアンソロジー」を購入したので、以前デブサミ2009で聞いた「オブジェクト指向エクササイズ」をやってみようと思っている。PHPでwebを作るときどの程度応用できるかにも興味があった。
同じころ。とある機能に仕様追加があったので、他人がずいぶん前に書いた箇所に手を入れる必要が出てきた。当該箇所を探り当て、ソースコードを開いて気絶しそうになった。
な、なんじゃこりゃ。
先日勉強会で「ダメコードをdisる」というそれはそれは悪意のあるテーマを取り上げたのだが、そっちのネタにすればよかった、と思うぐらいのコードが綴られていた。
ちょっと書き足す予定が大幅にリファクタして、やっと機能追加も完成し、私の心も(ほんの少し)晴れやかになった。そんなコードを二度と書かない / 書かせないために、「オブジェクト指向以前エクササイズのススメ」を提唱してみる。
注:
以下、とてもレベルの低いエクササイズが続きます。御用とお急ぎでない方のみ続きをどうぞ。
オブジェクト指向以前エクササイズ
リテラルをハードコードしたらうさぎ跳び
<?php
if ($status == ) // 0はどういう意味?成功?
{
$insentive = 650 ; // 650って報酬額?変更したいときはここ?
$dao->addInsentive($user[‘id’], $insentive) ;
}
?>漏れる条件分岐書いたら腹筋
<?php
// 「汎用イベントリスナ」とコメントしてあった
if ($status == ) // またリテラルだよ
{
if ($event_id == 123) // こっちもリテラル
{
// do_something
}
if ($event_id == 456)
{
// do_somethingelse
}
// あれ?条件式終わり?$event_idは絶対に増えないの?
}
?>適用ケースが2/15,000なのに「汎用」とかコメントしたら腕立て伏せ
– さっきの処理のデータソースを数えてみた
some_database=# SELECT COUNT(event_id) FROM events ;
count
——-
14987
(1 row)状態遷移を保存する変数を「$statu」と命名したら空気椅子
<?php
// 変数定義
$statu = ;
// 中略
// パラメータチェック
if (empty($_GET[‘some_id’]))
{
$status = 1;
}
// 粗忽すぎる…
?>
ソースコード2本、200行弱をざっと読んだだけでこれだけツッコミどころがあるなんて…とかなり暗澹たる気持ちになった。
本物の「オブジェクト指向エクササイズ」は「オブジェクトの広場」で公開されている。御用とお急ぎの方も、こちらはぜひご一読を。
そして恐ろしいことに、次はassertが山ほど仕込まれたPHPコードと向き合わねばならない。「Debug Hacks」購入記念「デバッグスキルエクササイズのススメ」をやる必要がありそうだ。
http://www.ogis-ri.co.jp/otc/hiroba/
http://www.ogis-ri.co.jp/otc/hiroba/Report/Developers_Summit2009/index.html