条件記述の統合
条件判定はできることなら統合してみるのはどうでしょうか。まずはどういうことかを理解するために、最悪な条件分岐を作ってみます。(そして気付かぬうちにこういうコードを書いてしまうものです。)
func main() {
weather := "sunny"
members := 18
breakTime := 100 * time.Minute
needBreakTime := 60 * time.Minute
if weather == "sunny" {
if members >= 18 {
if breakTime >= needBreakTime {
fmt.Println("play baseball")
} else {
fmt.Println("do not play baseball")
}
} else {
fmt.Println("do not play baseball")
}
} else {
fmt.Println("do not play baseball")
}
}
晴れていて、18人以上、1時間以上の休み時間があれば野球できるね!というだけの条件ですが、可読性が悪いですし、else 文への考慮(ハンドリング)も大変ですね。
まずは条件分岐を統合してみましょう!
func main() {
weather := "sunny"
members := 18
breakTime := 100 * time.Minute
needBreakTime := 60 * time.Minute
if weather == "sunny" && members >= 18 && breakTime >= needBreakTime {
fmt.Println("play baseball")
} else {
fmt.Println("do not play baseball")
}
}
だいぶスッキリしましたね。これでパッと見で野球できるときとできない時がわかるようになりました。
ではここからさらに 関数の分離
をしてみましょう。
func main() {
weather := "sunny"
members := 18
breakTime := 100 * time.Minute
needBreakTime := 60 * time.Minute
if isPlayBaseball(weather, members, breakTime) {
fmt.Println("play baseball")
} else {
fmt.Println("do not play baseball")
}
}
func isPlayBaseball(weather string, members int, breakTime time.Duration) bool {
return weather == "sunny" && members >= 18 && breakTime > (60*time.Minute)
}
いかがでしょう。 isPlayBaseball()
という関数にすることで、関数名がどんな責務をになっているのかわかることと、可読性も高くなりましたね。
関数の分離
は可読性を上げるだけでなく、適切な関数名を使用することでそれぞれの処理が実行するべき責務がわかりやすくなるのです。