メンバーと昼食をとってる時に「勢いで書いてるとif文をネストしがち」みたいな話が出た。ネストの解消はコツがあるんだけど、その時は特に話を広げることもなくて。記事にまとめることにしました。
public function is_deletable_event($event) {
if ($event) {
// 申し込みが0件
$count = EntryTable::select('*')
->where('event_id', $event->id)
->count();
if ($count == 0) {
// 特別招待された申し込みが0件
$priority = VIPEntryTable::select('*')
->where('event_id', $event->id)
->count();
if ($priority == 0) {
// クーポン利用の申し込みが0件
$has_coupon = CouponEntryTable::select('*')
->where('event_id', $event->id)
->count();
if ($has_coupon == 0) {
// 招待してない
if (!$event->has_invited) {
return true;
}
}
}
}
}
return false; // 無効なイベント
}
たとえば上記のような処理があるとします。よく見ると、true判定を得るための4階層の入れ子が構成されていることが分かるけど、パッと見た印象で分かりにくい。これは、下記のように書き直せます。
public function is_deletable_event($event) {
if (!$event) { // 無効なイベントは他の処理に判定を渡すため削除不可
return false;
}
// 特別招待をお送りした会員がいるイベントのため削除できない
if ($event->has_invited) {
return false;
}
// 有効な申し込みがあるから削除できない
if (EntryTable::select('*')->where('event_id', $event->id)->count()) {
return false;
}
// 特別招待された申し込みがあるから削除できない
if (VIPEntryTable::select('*')->where('event_id', $event->id)->count()) {
return false;
}
// クーポン利用の申し込みがあるから削除できない
if (CouponEntryTable::select('*')->where('event_id', $event->id)->count()) {
return false;
}
return true;
}
falseの壁を5つ乗り越えたらtrueにたどり着く。見た目に分かりやすい。これが「早期リターン」と言われる書き方で、true/falseを判定する目的の処理に向いています。