グローバル変数の倒し方4

前回は

グローバル変数への書き込みを無くす戦略について説明した。

今回は

今までのことを繰り返すことによってグローバル変数を倒したいと思う。現在のコードは以下の通り:

Option Explicit On
Option Strict On
Option Infer On

Module Program
    Dim ApplePrice As Integer = 0

    Sub PrintApplePrice(applePrice As Integer)
        Console.WriteLine("{0}円", applePrice)
    End Sub

    Sub UpdateApplePrice(ByRef price As Integer)
        Console.Write("{0}円から、", price)
        price = 80
        Console.WriteLine("{0}円に更新", price)
    End Sub

    Sub Main()
        ApplePrice = 100
        PrintApplePrice(ApplePrice)

        Dim price = ApplePrice
        UpdateApplePrice(price)

        PrintApplePrice(price)
    End Sub
End Module

グローバル変数 ApplePrice に依存している最終行から見ていくと、読み取りのみを行っている行があり、その直前で 100 を書き込んでいる。

ということは、読み取りを行っている行には 100 が渡されているのと同じだと分かる。

        ApplePrice = 100
        PrintApplePrice(ApplePrice)

        Dim price = ApplePrice

        ApplePrice = 100
        PrintApplePrice(100)

        Dim price = 100

に置き換えることができる。

これにより、ApplePrice への書き込みの後ろの参照が完全に消えた。

この時点で、ApplePrice にどのような書き込みをしようが、逆に書き込みをしなかろうが、影響するものは何もない。やっていることが前回と同じなので、説明もコピペになってしまう。

グローバル変数への書き込みが不要になったので消した結果、こうなった。

    Sub Main()
        PrintApplePrice(100)

        Dim price = 100
        UpdateApplePrice(price)

        PrintApplePrice(price)
    End Sub

この時点で、ApplePrice は読み取りも書き込みも一切がなくなったのでグローバル変数を削除することができる。おめでとう!グローバル変数を倒したのだ。

コード全体はこうなった。

Option Explicit On
Option Strict On
Option Infer On

Module Program
    Sub PrintApplePrice(applePrice As Integer)
        Console.WriteLine("{0}円", applePrice)
    End Sub

    Sub UpdateApplePrice(ByRef price As Integer)
        Console.Write("{0}円から、", price)
        price = 80
        Console.WriteLine("{0}円に更新", price)
    End Sub

    Sub Main()
        PrintApplePrice(100)

        Dim price = 100
        UpdateApplePrice(price)

        PrintApplePrice(price)
    End Sub
End Module

グローバル変数 ApplePrice の影はもうどこにもない。

次回は

メソッドの参照引数を倒します。


この記事が気に入ったらサポートをしてみませんか?