レガシーは消えず

リタイアしたプログラマのコーヒータイム

OK/NGを明示的に返すクラスを作ろう

みなさんは関数でOK/NGを返したいときはどうしていますか?あるプロジェクトではOK=Trueだと決めていても、isErrorみたいな関数ではNG=Trueにしたくなります。列挙体を使って定義しておくのが普通でしょうが、ちょっとこだわってResultクラスを作ってみました。

Public Class Result
    Class OKNG
        Public Shared Operator =(ByVal c1 As OKNG, ByVal c2 As OKNG) As Boolean
            If (c1 Is Nothing) OrElse (c2 Is Nothing) Then
                Return False
            End If
            Return (c1 Is c2)
        End Operator
        Public Shared Operator <>(ByVal c1 As OKNG, ByVal c2 As OKNG) As Boolean
            Return Not (c1 = c2)
        End Operator
    End Class
Public Shared OK As New OKNG
Public Shared NG As New OKNG
End Class

このクラスを返す関数の書き方こうなります

Function CheckSomething() As Result.OKNG
    If ~~ここで判定~~ Then
        Return Result.OK
    Else
        Return Result.NG
    End If
End Function

この関数を呼び出す方の書き方は以下のとおり

Sub Main()
    If CheckSomeThing = Result.OK Then
        ~~OK処理~~
    Else
        ~~NG処理~~
    End If
End Sub

OKNGクラスは変数を持たない空のクラスです。オペレーション(=/<>)のみを定義しておくことであたかも値を持つ定数のような使い方ができます。
このようなちょっとしたクラスをまとめたdllを作っておくと、アプリケーション側でインポートしてすぐに使うことができるのでとても便利です。