グローバル変数の倒し方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 の影はもうどこにもない。
次回は
メソッドの参照引数を倒します。
この記事が気に入ったらサポートをしてみませんか?