参照引数の倒し方
前回は
コードの変更を繰り返すことによってグローバル変数を倒せることを説明した。
今回は番外編として、参照引数を倒したいと思う。
前回までのコードは以下:
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
UpdateApplePrice の引数が参照の形 (ByRef) になっている。参照引数も、グローバル変数に次いで悪しきものであることが多い。今回はこの引数を倒したいと思う。
基本的な戦略は、「元の値をコピーで受け取り、新しい値を Return で返す」である。メソッドのシグネチャが変わるので、呼び出し元も呼び出し先も修正する必要がある。コードで示す:
Function UpdateApplePrice(price As Integer) As Integer
Console.Write("{0}円から、", price)
price = 80
Console.WriteLine("{0}円に更新", price)
Return price
End Function
Sub Main()
PrintApplePrice(100)
Dim price = 100
price = UpdateApplePrice(price)
PrintApplePrice(price)
End Sub
「Return で複数の値を返せないじゃないか」と思う人もいるかもしれないが、その場合は昔だったら構造体を返せばよかったし、現代ではタプルで簡単に返せる。これは言語は関係ない Visual Basic .NET であろう C# であろうと昔から可能で当たり前のことだった。
今回は参照引数を、値で受け取る形に変更し、変更後の値を Return で返す形に変形することを示した。
次回は
次回はローカル変数への代入を消す方法を示したい。