LoginSignup
2
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-07-17

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0