Help us understand the problem. What is going on with this article?

true/false判定に向いている「早期リターン」

メンバーと昼食をとってる時に「勢いで書いてると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を判定する目的の処理に向いています。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away