1つ目のジョブが成功なら2つ目のジョブを実行するという処理を
何の疑問も持たずにこんなコードで書く人達がいる。
public enum Result { SUCCESS, FAILED } public class TaskExecuter { public void execute(Job job) { job.firstTask(); if( job.getResult() != Result.FAILED ) { job.secondTask(); } } }
これはダメなコードです。さて、何がダメでしょうか。
エンハンスによりEnumがこうなったらどうでしょう。
public enum Result { SUCCESS, FAILED, SUSPEND }
そう、もう期待通りには動きません。
前の処理が終わっていないのに次の処理を実行してしまいます。
なぜこんなコードを書いてしまうのでしょうか。
それは「失敗でなければ成功」という思い込みですね。
失敗でなければ成功などとは考えてはいけません。
「失敗でなければ失敗していない」以上の何物でもないのです。
私の経験上、思い込みというのはバグの発生源としてかなりの勢力を持っています。
また、バグが見つけられない理由としても一大勢力を築いています。
そんなわけでこう書くべきなのです。
if( job.getResult() == Result.SUCCESS ) { job.nextTask(); }
成功したとき以外には動いてもらっては困るのですから成功したら実行と素直に書けばよろしいのです。
同じようにこれはダメです。
if( job.getResult != Result.SUCCESS ) { throw new SomeException("errorだよ"); }
答えを曖昧にする日本人なのになぜかプログラムでは中間状態を無視してしまうような思考をするのは不思議ですね。