佐々木屋

技術的なことから趣味まで色々書きます

ガード節によるネスト防止

ステートメントをネストし過ぎると可読性が著しく低下します。逆に言えばネストが少なければ見やすくなるのです。

課題

以下のような数値をチェックするような関数を考えます。

private int test1(int x, int y, int z) {
    int res = 0;

    if (x < 0) {
        res = 1;
    }
    else {
        if (y < 0) {
            res = 2;
        }
        else {
            if (z < 0) {
                res = 3;
            }
        }
    }

    return res;
}
Private Function test1(ByVal x As Integer, ByVal y As Integer, ByVal z As Integer) As Integer
    Dim res As Integer = 0

    If x < 0 Then
        res = 1
    Else
        If y < 0 Then
            res = 2
        Else
            If z < 0 Then
                res = 3
            End If
        End If
    End If

    Return res
End Function


リファクタリング

この場合はガード節を利用したリファクタリングが効果的です。ガード節とは、レアケースと通常ケースを切り分け、早めにreturnなどで抜けてしまう手法をいいます。ガード節を利用するとステートメントのネストを減らすことができ、また異常系と正常系の切り分けが認識しやすくなるメリットがあります。

private int test2(int x,int y,int z) {
    if (x < 0) return 1;
    if (y < 0) return 2;
    if (z < 0) return 3;

    return 0;
}
Private Function test2(ByVal x As Integer, ByVal y As Integer, ByVal z As Integer) As Integer
    If (x < 0) Then Return 1
    If (y < 0) Then Return 2
    If (z < 0) Then Return 3

    Return 0
End Function

このようにガード節を用いると、「条件に全く一致しない場合は、初期値を返す(何もしない)」を明確に提供することが出来ます。