【初心者向け】「return」がイマイチ分からない2年前の自分に向けての記事（if-elseの話も少し）

# この記事を読んで習得できること
- プログラミングを初めてまだ「return」の使い方が分からない方々
- 3年前の私

# 経緯
大学院でプログラムを書いていた2017年（3年前）のボク。
大学の研究で実験の解析で必要だったため、必死で書いていたのをなんとなく覚えている。

ひとまず、自分の行いたい解析プログラムは動くようになり、
喜びながらそのプログラムを使って解析を行っていた。

ひと段落してから、プログラムを見てみると、
「結構ソース汚いな…」と思い、修正しようと試みた。

しかし、ソースのスパゲッティ感*が半端なく、
なかなか修正が出来ずに、前回と同じようなソースなのに、
一から書き直したのを覚えている。

#3年前のソースで何が起こっていたのか
おおよそのイメージだが、こんな感じ。

```sample.swift
func yabaiCode() {
    if 条件1 {
        処理1(15行以上）
        処理A(10行以上)
        処理4(10行以上)
    } else if 条件2 {
        処理2(15行以上）
        処理A`(10行以上)
        処理5(10行以上)
    }  if 条件3 {
        処理3(15行以上)
        処理A``(10行以上)
        処理6(10行以上)
    } else {
        処理7(20行以上)
    }
}
```

何が言いたいかって、条件分岐の中の処理がとんでもなく長いのだ。
しかし、処理を分けたいのだが、分け方がイマイチ分からない。
どうやら、メソッドで分割していけば、もっと簡単に処理ができるとのことだ。

でも、メソッドで分けることが出来なかった。
メソッド間での、値の受け渡しが分からなかったのだ…


んで、結局分からないまま、このままのコードを残して卒業してしまったわけだが（後輩ちゃんごめん）、
今になって（流石に）return文がある程度分かった自分が、過去の自分にreturnを教えるために、この記事を書いたってわけです。

# returnの主な使い方は2つ
## 1.メソッドを終了させる

```sample.swift
func return1() {

    num = 5 // 好きな数値を入れる

    if num == 4 {
        print("4です")
        return
    } else if num == 5 {
        print("5です")
        return 
        // このメソッドはここで終了するはず
        // これ以降は処理されない
    }  if num == 6 {
        print("6です")
        return
    } else {
        print("分からない")
        return
    }
}
```

このreturnは、**無駄な処理を省く**ことができる。
途中で答えが出たら、その時点で処理を終了させればいいし、
また、returnがあるおかげで、`if-else`を使わなくてよくなる。

if-elseは、処理が多くなる上に、ifとelseが同時でいることが前提になるため、
１メソッドあたりの処理が多くなることがある。
読みにくくなったりもする。
職場によっては、「`if-else`禁止！」なんてところもあるだろう。
（自分の部署はそうでした）

どんだけif-elseがないとコードが読みやすくなるか。
FizzBuzz文を参考にしてみたいと思う。


まずは、if-else文を使用したもの。

```FizzBuzz.swift
func fizzBuzz() {
    for i in 1...30 {
        judgeFizzBuzz(num: i)
    }
}

func judgeFizzBuzz(num : Int) {
    if num % 15 == 0 {
        print("FizzBuzz")
    } else if num % 3 == 0 {
        print("Fizz")
    } else if num % 5 == 0 {
        print("Buzz")
    } else {
        print(num)
    }
}
```

めっちゃ悪いわけではないが、もし仮に、7の倍数の時の処理を入れるなんて時は、
気をつけないと、全ての処理がぶっ壊れてしまう。
（return使うときももちろん気をつける必要があるが）

では、return文を使ってみる。

```FizzBuzz.swift
func fizzBuzz() {
    for i in 1...30 {
        judgeFizzBuzz(num: i)
    }
}

func judgeFizzBuzz(num : Int) {
    if num % 15 == 0 {
        print("FizzBuzz")
        return
    } 

    if num % 3 == 0 {
        print("Fizz")
        return
    } 

    if num % 5 == 0 {
        print("Buzz")
        return
    }
    
    print(num)
}
```

if文がパーツ化されるので、実に見やすい。本当に素晴らしい。
何もなければnumがprintされるってことも一目瞭然だ。

### 補足
2023年にこの記事を見返してると、とんでもない実装をしていたんだなあと思う。
そんなprintなんか使うな。と思う。

と、思ったけど、当時も以下にいい感じの処理書いてたじゃん。
まあ、戒めのためにも書いとくか。（間違っても3年前のような実装をしないように）

## 2.値を返してくれる
ここでは、数値を返してくれるメソッドを使用する

```sample.swift
func say() {
    num = 5
    doubleNum = doubleNum(num) // 10が返ってくる
}

// 2倍した数値を返してくれる関数
func doubleNum(num :Int) -> Int {
    return num * 2 //数値を返す
}
```

別のメソッドで計算して、処理結果を返してもらうってことも容易になる。

FizzBuzz使うとさらにお分りいただけるかもしれない。

```FizzBuzz.swift
func fizzBuzz() {
    for i in 1...30 {
        print(judgeFizzBuzz(num: i))
    }
}

func judgeFizzBuzz(num : Int) -> String {
    if num % 15 == 0 {
        return "FizzBuzz"
    }
    
    if num % 3 == 0 {
        return "Fizz"
    }

    if num % 5 == 0 {
        return "Buzz"
    }

    return String(num)
    
}
```

1で書いたものよりも、さらに見やすくなったと思う。
`judgeFizzBuzz`がStringを返すようになったということで、全体としてのコード量も減った（print）

# まとめ
returnをうまく使わないとメソッドが盛り盛りになってしまうので、もし使っていない方がいたら是非使って欲しい。
これを知らないで、よく大学卒業できたな、俺…