前のページ
Featured image of post リファクタリング 〜条件分岐の可読性を高める〜

リファクタリング 〜条件分岐の可読性を高める〜

条件記述の統合

条件判定はできることなら統合してみるのはどうでしょうか。まずはどういうことかを理解するために、最悪な条件分岐を作ってみます。(そして気付かぬうちにこういうコードを書いてしまうものです。)

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() という関数にすることで、関数名がどんな責務をになっているのかわかることと、可読性も高くなりましたね。

関数の分離 は可読性を上げるだけでなく、適切な関数名を使用することでそれぞれの処理が実行するべき責務がわかりやすくなるのです。

参照

リファクタリング(第2版): 既存のコードを安全に改善する (OBJECT TECHNOLOGY SERIES)

Licensed under CC BY-NC-SA 4.0
このページでは、Google Analyticsを利用しています。