「ネストを平坦化(浅くする)」リファクタリングは、初心者から中級者へ進むための重要ステップです。
ここでは、
「深い if の入れ子を、どうやって読みやすくするか」
を ステップごとに実演 していきます。
ステップ実演:ネストを平坦化する手順
ステップ0:元のコード(深いネスト)
まずは「悪い例」から見てみましょう。
def check_access(age, is_member, has_ticket):
if age >= 18:
if is_member:
if has_ticket:
print("入場OK(大人・会員・チケットあり)")
else:
print("チケットが必要です")
else:
print("会員登録が必要です")
else:
print("18歳未満は入場できません")
Python問題点
- 3段ネストで見づらい
- 「何をチェックしているか」が追いにくい
- 条件の組み合わせが増えるほど混乱する
ステップ1:条件を逆にして「早期リターン」で脱出
「条件を満たさない」場合に早く抜けるようにします。
def check_access(age, is_member, has_ticket):
if age < 18:
print("18歳未満は入場できません")
return
if not is_member:
print("会員登録が必要です")
return
if not has_ticket:
print("チケットが必要です")
return
print("入場OK(大人・会員・チケットあり)")
Pythonどう変わった?
- ネストがなくなり、直線的に流れる
- 条件が「ダメな場合→抜ける」というガード節(guard clause) になっている
- 「通過したらOK」なので分岐の順序が自然
ステップ2:条件を関数化して意味を明確に
複雑な条件を関数に切り出して、「名前で意味が分かる」ようにします。
def is_adult(age):
return age >= 18
def can_access(age, is_member, has_ticket):
return is_adult(age) and is_member and has_ticket
def check_access(age, is_member, has_ticket):
if not is_adult(age):
print("18歳未満は入場できません")
return
if not is_member:
print("会員登録が必要です")
return
if not has_ticket:
print("チケットが必要です")
return
print("入場OK(大人・会員・チケットあり)")
Pythonメリット
- 関数名が条件の意味を伝える
- 他の箇所で
is_adult(age)を再利用できる - if の中身がシンプルに読める
ステップ3:ルールが固定なら辞書化(条件表で整理)
条件が単純な組み合わせなら、**条件表(辞書)**で管理できます。
def check_access(age, is_member, has_ticket):
rules = {
(False, None, None): "18歳未満は入場できません",
(True, False, None): "会員登録が必要です",
(True, True, False): "チケットが必要です",
(True, True, True): "入場OK(大人・会員・チケットあり)"
}
key = (age >= 18, is_member if age >= 18 else None, has_ticket if is_member else None)
print(rules.get(key, "条件エラー"))
Pythonメリット
- 条件を増やすときに
ifを増やさなくていい - 「ルール表」として見やすい
ステップ4:再利用を意識した構造に(関数+戻り値)
print文ではなく「結果文字列を返す」関数にしておくと、
GUI・Webアプリ・ログ出力などどこでも使える。
def check_access(age, is_member, has_ticket):
if age < 18:
return "18歳未満は入場できません"
if not is_member:
return "会員登録が必要です"
if not has_ticket:
return "チケットが必要です"
return "入場OK(大人・会員・チケットあり)"
# 呼び出し側
print(check_access(20, True, False))
Pythonメリット
- print を別の場所に移せる(テストしやすい)
- 条件ロジックだけ独立して保てる
ステップ5:可読性チェック(平坦化後)
「コードが自然に読めるか?」を確認します。
def check_access(age, is_member, has_ticket):
if age < 18:
return "18歳未満は入場できません"
if not is_member:
return "会員登録が必要です"
if not has_ticket:
return "チケットが必要です"
return "入場OK(大人・会員・チケットあり)"
Pythonこれなら、上から順に読むだけでロジックが頭にスッと入る。
「深い if」がなくなり、誰が見ても理解しやすいです。
まとめ:ネスト平坦化の手順表
| ステップ | 手順 | ポイント |
|---|---|---|
| 0 | ネストされたコードを確認 | 条件が多層で読みづらい状態 |
| 1 | 逆条件で「早期リターン」 | ダメな場合はすぐ抜ける |
| 2 | 条件式を関数化 | 名前で意味を明確にする |
| 3 | 条件表(辞書)に置き換え | 複数条件の組み合わせ整理 |
| 4 | 戻り値にして再利用性UP | printに依存しない構造 |
| 5 | 可読性確認 | 上から下へ自然に読める流れに |
