何を言ってるのかわからねーと思うが、条件分岐を話すぜ｜文章題で身に付くプログラミング思考入門️（7/25）

## はじめに

今回は、条件分岐について解説していきます。

### 想定できない想定外を想定して事前に対策することは重要です。
何を言っているのかわからないと思います。頭がどうにかなりそうです。

『文章題で身に付くプログラミング思考入門️』は、日常や文章問題からプログラミング思考を身に付けていく、簡単で身近で、あなたをちょっと輝かせてくれるシリーズです。

今回は、条件分岐についてお話ししていきましょう。

## 前回のまとめ
味噌汁で考える良いアルゴリズム
- アルゴリズムとは、簡単に言えば「やり方」のことです。
- どのようなアルゴリズムが良いアルゴリズムなのかは、人や、環境や、時代や、状況によって変わります。
- 大事なのは、ユーザーが何を大切に思っていて、本当は何をやりたくないのか。ユーザーに寄り添うことです。

前回の記事は[こちら](https://qiita.com/yuki-TheWaggle/items/a888329520af970025b5)
第一回は[こちら](https://qiita.com/yuki-TheWaggle/items/a6845c85a464c3c46ab2)

## 対象者
- プログラミングを学びたい人
- プログラミングに挫折したことのある人
- 論理的思考を鍛えたい人
- 文系の人
- エンジニアの思考を理解したい人

## 概要
さて、 [第二回](https://qiita.com/yuki-TheWaggle/items/7ab3f08b9bab012c98ee)の渋谷の会話を思い出してみましょう。

> 「明日渋谷に行くんだよね」
> 「何で渋谷まで行くの？」
> 「電車で行く」
> 「そうなんだ、電車で行くんだね。渋谷に行く理由は？」

渋谷に行く理由が知りたかった私は、
- 条件分岐）あなたが交通手段を教えてくれたのを受けて、
- 分岐に応じた処理）「渋谷に行く理由は？」と質問をしました。

これが条件分岐でしたね。

> `条件分岐`とは、回答によって質問を変えることです。
> 言い換えれば、得られた情報が当てはまったかどうかによって処理を変えることです。

英語で言うと、if ですね。
「もし`〇〇`ならば、`◆◆◆`」です。

渋谷の例に当てはめると、
「もし`あなたの回答が交通手段である`ならば、`私は渋谷に行く理由を質問する`」

- `〇〇` = `あなたの回答が交通手段である`
- `◆◆◆` = `私は渋谷に行く理由を質問する`

**ここで大事なのは、`〇〇` の選び方です。**
「もし`〇〇`ならば」を仮説で立てておいて、次の行動を想定しておくことが大事です。

プログラムの世界ではユーザーが利用する前にシステムを作りますから、

### ユーザーがどのように利用するのか？どのような予想外の行動をとるのか？あらかじめ考えて対策を作り上げておきます。

- オーソドックスな手順、つまり正常な動きを想定すること
- 想定外の手順、つまり不正確な動きを想定すること

この2点が必要です。

渋谷の会話で言えば、「何で渋谷まで行くの？」に対する回答として3つのパターンが考えられますね。

①あなたが、`渋谷に行く理由`を回答する
②あなたが、`交通手段`を回答する
③あなたが、`それ以外`を回答する

それに対する私の準備は、

❶納得する
❷渋谷に行く理由を聞く
❸質問の意図を伝えてもう一度質問する

といったものが考えられます。
コミュニケーション能力が高い人は、この辺りを想定してから発言しているのでしょう。
ボケとツッコミなんかもそうですよね。

会話がスムーズだったり盛り上がったりする裏側には、こういった仕組みが隠されていたんですね。

もうちょっと具体的に、今度はプログラムに置き換えて考えてみましょうか。

ユーザーにメールアドレスを入力してもらいたいことにしましょう。
そのために、どのように利用するのか？どのような想定外の行動をとるのか？どのような対策が必要か？考えてみましょう。

まずは目的を具体化します。

```
目的：ユーザーからメールアドレスを取得する
```

次に、「もし〇〇ならば、◆◆◆」の「〇〇」を挙げます。
ユーザーはどのように利用し、どのような想定外の行動を取るでしょうか？

```
目的：ユーザーからメールアドレスを取得する

条件分岐：もし〇〇ならば

（どのように利用するか：正常な動き）
- もしメールアドレスが正しく入力されたなら

（どのような想定外の行動を取るか：不正確な動き）
- もし何も入力されていなかったら
- もし入力内容がメールアドレスの形式でなかったら
- もし入力内容が長すぎたら
```

最後に、「もし`〇〇`ならば、`◆◆◆`」の「`◆◆◆`」を挙げます。

```
目的：ユーザーからメールアドレスを取得する

条件分岐：もし〇〇ならば、◆◆◆

（どのように利用するか：正常な動き）
- もしメールアドレスが正しく入力されたなら、「次へ」ボタンを押せるようにする

（どのような想定外の行動を取るか：不正確な動き）
- もし何も入力されていなかったら、入力の案内を出す
- もし入力内容がメールアドレスの形式でなかったら、正しい形式での入力を促す
- もし入力内容が長すぎたら、最大文字数を伝える
```

想定外の動きについては、そもそも想定外ですから、なかなか予想が難しい面がありますね。
なので、想定できない想定外はマルっと「それ以外」で括ってしまうのも手です。

今回は、正常な動きを以下のように設定して括ってみました。
```
- もしメールアドレスが正しく入力されたなら、「次へ」ボタンを押せるようにする
```

つまり **不正確な動きであれば、そもそも次へ進めない** ようにしたことで、想定できない想定外をマルっと担保してみました。

こういった **「もし`〇〇`ならば、`◆◆◆`」がシステムにあらかじめ用意されているので、ユーザーは何をしたらいいのかがわかるようになり、システムはユーザーから情報を取得することができます。**

あらかじめ期待しない動きを想定して対策を練っておくと、その後の処理がお互いとてもスムーズになります。
ただし、対策も練りすぎてはいけません。ほとんど起きる可能性がないことにリソースを大量に使うのはもったいないですから。

ちなみに現場では、最初から細かく想定して1から作り上げることはそれほど頻繁にはないでしょう。
過去の試行錯誤を元に作られ、改良を重ねられた定型のパターンが提供されています。
それが、テンプレートやフレームワークです。

テンプレートとは、具体的な雛形です。
フレームワークとは、ある目的を達成するための全体的な枠組みです。

**大事なのは、テンプレートやフレームワークを使う上で、仕組みを理解することです。**

そもそもどんな考え方の上でプログラムが出来上がっているのか、どんな仕組みが実装されているのか、今回やりたいことは何なのか、どのような改良が必要か。

### 「もし`〇〇`ならば、`◆◆◆`」を考えられる力があってこそ、仕組みを正しく使うことができます。

期待通りの動きを実現する準備の他に、起きそうな間違いを想定した対策と、その想定以外を想定した対策を施しましょう。
今回施した

> 想定できない想定外を想定して事前に対策

の内容は、

> 不正確な動きであれば、そもそも次へ進めない

でした。

次回は、繰り返し処理について解説していきます。

## まとめ
- 想定できない想定外を想定して事前に対策することは重要です。
- ユーザーがどのように利用するのか？どのような予想外の行動をとるのか？あらかじめ考えて対策を作り上げておきます。
- 「もし`〇〇`ならば、`◆◆◆`」を考えられる力があってこそ、仕組みを正しく使うことができます。

## 最後に
ここまで読んでくださってありがとうございます！
少しでも役に立ったら「いいね」をください。続ける励みになります。
冒頭部分、自分でも何を言っているのか分からないなと思ったらポルナレフが出てきました。皆さんは誰が好きですか？