この記事を読んで習得できること
- プログラミングを初めてまだ「return」の使い方が分からない方々
- 3年前の私
経緯
大学院でプログラムを書いていた2017年(3年前)のボク。
大学の研究で実験の解析で必要だったため、必死で書いていたのをなんとなく覚えている。
ひとまず、自分の行いたい解析プログラムは動くようになり、
喜びながらそのプログラムを使って解析を行っていた。
ひと段落してから、プログラムを見てみると、
「結構ソース汚いな…」と思い、修正しようと試みた。
しかし、ソースのスパゲッティ感*が半端なく、
なかなか修正が出来ずに、前回と同じようなソースなのに、
一から書き直したのを覚えている。
#3年前のソースで何が起こっていたのか
おおよそのイメージだが、こんな感じ。
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.メソッドを終了させる
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が同時でいることが前提になるため、
1メソッドあたりの処理が多くなることがある。
読みにくくなったりもする。
職場によっては、「if-else
禁止!」なんてところもあるだろう。
(自分の部署はそうでした)
どんだけif-elseがないとコードが読みやすくなるか。
FizzBuzz文を参考にしてみたいと思う。
まずは、if-else文を使用したもの。
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文を使ってみる。
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.値を返してくれる
ここでは、数値を返してくれるメソッドを使用する
func say() {
num = 5
doubleNum = doubleNum(num) // 10が返ってくる
}
// 2倍した数値を返してくれる関数
func doubleNum(num :Int) -> Int {
return num * 2 //数値を返す
}
別のメソッドで計算して、処理結果を返してもらうってことも容易になる。
FizzBuzz使うとさらにお分りいただけるかもしれない。
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をうまく使わないとメソッドが盛り盛りになってしまうので、もし使っていない方がいたら是非使って欲しい。
これを知らないで、よく大学卒業できたな、俺…