見出し画像

道路標識から学ぶ条件分岐とコメント

ごきげんよう🙋‍♀️ツクリンクでエンジニアリングマネージャーをやっているあっきー(@kuronekopunk)です。
社内でやっている10分勉強会(LT会)で外部の方も招待しつつ、ネタっぽい話をしたのでまとめます。
外部の方にもLTしていただき楽しい会になりました。定期的に招待していこうと思います。



この道路標識分かりますか?

ざっくり前提説明

こんな十字路で赤い矢印の進行方向に進む際に見える標識を想定しています。


お題1

これのタイプは『指定方向外進行禁止』という進行方向の制限を表す標識
今回は『直進 以外禁止』ということになります。

これをコードにしてみると?(ざっくり雰囲気が伝わればいいです)

def 通行可能?(進行方向)
  if 進行方向が直進
    return OK
  else
    raise 🚨交通違反
  end
end


お題2

お題1に左折も追加されたもの
『直進、左折 以外禁止』ですね。

コードにしてみると

def 通行可能?(進行方向)
  if 直進 or 左折
    return OK
  else
    raise 🚨交通違反
  end
end


お題3

時間の制約が追加されました。
これは『8-20時のみ 直進 以外禁止』
逆に、8-20時以外は進行方向に制限は無いということになります。

コードにしてみると

def 通行可能?(進行方向)
  if 8-20時?
    if 直進
      return OK
    else
      raise 🚨交通違反
    end
  else
    return OK
  end
end


お題4

時間にプラスして、曜日の指定が増えました。
これは『土日祝を除く 7:30-8:30のみ 直進 以外禁止』
土日祝を除く=平日 の7:30-8:30のみ 直進 以外禁止、逆に他の時間帯は制限が無いということ。

コードにしてみると

def 通行可能?(進行方向)
  if 土日祝でない and 7:30-8:30
    if 直進
      return OK
    else
      raise 🚨交通違反
    end
  else
    return OK
  end
end

リファクタの余地はありそうですがこのまま進めてみましょう。


お題5

標識が2個あるパターンです。

  1. 『土日祝を除く 7:30-8:30のみ 直進 以外禁止』

  2. 『8:30-翌日7:30のみ 直進、左折 以外禁止』

コードにするとどうなるでしょう?

def 通行可能?(進行方向)
  if 平日 and 7:30-8:30 # ①パターン
    if 直進
      return OK
    else
      raise 🚨交通違反
    end
  else # ②パターン
    if 直進 or 左折
      return OK
    else
      raise 🚨交通違反
    end
  end
end

こうかな・・・?


実はこの2つの標識だけだと、MECEじゃないです。
①は平日7:30-8:30
②は8:30-翌日7:30のみ(平日、土日祝両方)
ということで土日祝7:30-8:30のルールが定義されていません。

このまま実装すると想定されない挙動をしそう…

実はこの標識実在するらしく、地面に『右折禁止』と書かれているそうです。
つまり土日祝7:30-8:30は②と同じ。


もう少し考えてみよう

条件をおさらい

  1. 『土日祝を除く 7:30-8:30のみ 直進 以外禁止』

  2. 『8:30-翌日7:30のみ 直進、左折 以外禁止』

調べてみると
左折方向にはX学校があり、平日の通学時間(7:30-8:30)はA道路を通行禁止にしているらしい!

こんなコメントと関数の名前を変えてみると理解しやすくなるかも?

# 交通渋滞、事故が多いため常時右折禁止
# 左折方向に学校があるため通学時間帯は左折禁止
def 通行可能?(進行方向)
- if 平日 && 現在時刻が7:30-8:30 # ①パターン
+ if 通学時間帯か? # ①パターン
    if 直進
      return OK
    else
      🚨交通違反
    end
  else # ②パターン
    if 直進 || 左折
      return OK
    else
      🚨交通違反
    end
  end
end

+ def 通学時間帯か?
+   平日 && 現在時刻が7:30-8:30
+ end

もうちょっと考えてみると
対向車線からもA道路へ入ることを考えると
『A道路は通行可能?』
といった判定のほうが理解しやすいかも?

# X交差点B道路北上方面
def 通行可能?(進行方向)
  if 左折
    if A道路は通行可能?
      return OK
    else
      🚨交通違反
    end
  elsif 右折
    # 交通渋滞、事故が多いため右折禁止
    🚨交通違反
  elsif 直進
    return OK
  else
    raise ???
  end
end

# 学校があるため通学時間帯は通行禁止
def A道路は通行可能?
  !X学校の通学時間帯? # 7:30-8:30は通学時間帯
end


さいごに

標識を題材にコーディングのワークショップを行ってみました。
まとめとしてはこんな感じ

  • 機能要件だけを実装すると分からなくなるよ

  • ドメイン知識を理解してコードに落とすことで理解しやすくなるよ

  • なぜそうなっているか、ドメイン知識を補う情報をコメントに残すと更に理解しやすくなるよ

また外部の方招待してやりたいので興味あれば声かけてください🙌

読んでくれてありがとうございます!少しでもいいなと思ったら「スキ❤️」してもらえると飛んで喜びます!シェアしてもらったらもっと嬉しいです!