« 2013年4月 | トップページ | 2013年6月 »

2013年5月26日 (日)

自分自身を再定義するラムダ式

ラムダ式の導入でVBでも関数型言語のようなプログラミングをやろうと思えば真似できるようになってきました。

たとえば、最初に関数(メソッド)が呼び出されるときに、その関数が自分自身をよりシンプルに再定義することができます。

例として、管理者と一般ユーザーとで同じ関数を呼び出しても処理内容が違う場合を考えてみましょう。

普通のVBの発想ではIf文で切り分けるか、管理者と一般ユーザーをそもそも別クラスにしておくという構成をとると思います。関数が自分自身を再定義することで次のようにも書くことができるようになります。

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.DoAnything()
    End Sub

    Public DoAnything As Action =
        Sub()
            If IsAdministrator() Then
                Me.DoAnything =
                    Sub()
                      '管理者用の処理
                        MsgBox("管理者権限の場合の処理")
                    End Sub
            Else
                Me.DoAnything =
                    Sub()
                        '一般ユーザーの場合の処理
                        MsgBox("一般ユーザーの場合の処理")
                    End Sub
            End If

            Me.DoAnything()

        End Sub

    Public Function IsAdministrator() As Boolean
        '省略
        MsgBox("権限を調べます。")
    End Function

End Class

これを実行すると、最初は

「権限を調べます。」

「一般ユーザーの場合の処理」

と表示されますが、2回目以降は「一般ユーザーの場合の処理」とだけ表示され、権限をもう一度調べることをしません。最初の時点で一般ユーザーであることがわかっているので2回目以降は無駄なことをしないような構造になっています。

しかし、見てわかるようにプログラムがとても難しく感じられます。このケースでは普通にIf文かクラスを分ける方がよいでしょう。

ここでは、こんなこともできるという例として紹介しました。この発想をもっと有効に役立てられるシーンがあるかもしれません。ないかもしれません。今のところは思いつきません。

| | コメント (0) | トラックバック (0)

2013年5月11日 (土)

IsNothingと Is Nothingの違い

変数がNothingであるか調べるにはIsNothing関数の戻り値を見る方法と、 Is Nothing 使って調べる方法の2つがあります。

Dim s As String

'お勧めの方法
If s Is Nothing Then
    '省略
End If

'お勧めではない方法
If IsNothing(s) Then
    '省略
End If

Is Nothing の方が少し動作が速いのでこちらを使うべきです。

両者にはもう1つ違いがあります。

IsNothing関数は値型の変数に対しても使えるのに対し、Is Nothingは値型の変数に対して使用するとビルドエラーになります。

けれど値型の変数がNothingであるか調べたくなる場合は皆無といってよく、この違いは無視できます。多分、この余計な機能がついている分IsNothingの方が遅いのでしょう。

念のために補足しておくと値型の変数をNothingにすることはできず、値型の変数に対するIsNothing関数は常にFalseを返します。

Dim i As Integer = Nothing 

のようなプログラムは一見Nothingを代入しているように見えますが、実は初期値である0を代入しています。(だからこの例のプログラムは意味がありません。)

| | コメント (0) | トラックバック (0)

« 2013年4月 | トップページ | 2013年6月 »