参照引数の倒し方

前回は

コードの変更を繰り返すことによってグローバル変数を倒せることを説明した。

今回は番外編として、参照引数を倒したいと思う。

前回までのコードは以下:

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 で返す形に変形することを示した。

次回は

次回はローカル変数への代入を消す方法を示したい。


いいなと思ったら応援しよう!