🕸️

【初学者向け】マインドマップを使用し、複雑な条件分岐を整理する

2024/02/25に公開

はじめに

コードの可読性を上げることは品質を高める上で重要な要素の一つです。条件分岐が増えるとコードの複雑さも増してしまいます。If文を効率的に使用する方法はいくつかありますが、ここでは初学者向けにマインドマップを使用してコードを整理し、論理演算子を用いて条件分岐をシンプルにする方法を説明します。

開発言語

Ruby 3.2.0

実例:トランプの「戦争」におけるカードの勝敗判定

トランプの「戦争」は、プレイヤーが1枚ずつカードを出し合い、最も高いカードを出したプレイヤーが場に出されたカードを総取りするというゲームです。このゲームでは「2が最低で、Aが最高」とされ、「引き分け」の場合は再度カードを出し合い競います。(詳しくは下記URL参照)

https://playingcards.jp/game_rules/war_rules.html

特別ルールの追加:

通常のルールに+αとして特別ルールを追加します。

最強のカード:

  • ジョーカー: ゲームに最強のカードであるジョーカーを1枚追加します。ジョーカーが存在する場合、数字の優劣関係なくジョーカーを出したプレイヤーが総取りします。
  • スペードのA: Aのカードが複数存在し、その中にスペードのAがある場合、スペードのAが最強のカードとなり、総取りします。

勝敗判定の条件:

  • ジョーカーのみが存在する場合、通常はジョーカーが勝ちます。
  • ただしジョーカーが存在しても、「Aが複数ある」かつ「スペードのAが存在する」場合のみ、スペードのAが勝ちとなります。

このルールでの勝敗判定は以下の条件が考えられます。

ここで単純にIf文で分岐させていくと記述するコードの量も多くなり、可読性が落ちてしまいます。
そこで出力結果も記載して結果ごとに色をつけてグルーピングし、効率よく条件分岐を記載していきます。

論理演算子を使用して処理をまとめる

まずは「引き分けがある」かつ「Aが存在する」かつ「スペードのAがある」という条件の場合の結果を押さえます。

main.rb
if tie_exists && a_exists && spade_a_exists
  # スペードのAが勝つ処理
end

これでまずはスペードのAになる処理は押さえることができました。
残りの条件は下記になります。

マインドマップを見てわかるように、一つ目の条件に一致せずジョーカーが存在する場合は全てジョーカーになっています。
次にここを押さえていきます。

main.rb
if tie_exists && a_exists && spade_a_exists
  # スペードのAが勝つ処理
elsif joker_exists
  # ジョーカーが勝つ処理
end

残りの条件は下記になります。続きも同じような考えで条件を押さえていきます。

残りの条件の中で、分岐されている部分は「引き分けの有無」ですので、それをコードに落とし込みます。

main.rb
if tie_exists && a_exists && spade_a_exists
  # スペードのAが勝つ処理
elsif joker_exists
  # ジョーカーが勝つ処理
elsif tie_exists
  # 引き分けの処理
else
  # 通常の勝敗の処理
end

上記のようにすっきりとコードをまとめることができました。

マインドマップを使用していると当たり前のように見えてしまいますが、一番最初に&&で複数条件を指定したことで、3つ目の条件では「引き分けの有無」を指定するだけで条件を絞ることができています。

終わりに

今回使用したマインドマップのアプリはマインドマイスターというサービスです。

https://mindmeister.jp/

私もそうでしたが初学者の場合、まずエディター上で「どのようなコードを書こうか」と考えてしまいがちです。
マインドマイスターの他にもMiroやFigmaなど無料で使えるアプリもたくさんあるので、それらを使用することで頭の中を整理することができます。
詰まった時などは一度そのようなツールを使用してみるというのも一つの手だと思いますので是非参考にしてみてください。

Discussion