« Visual StudioでAzureプログラミングをするときの基本的なエラーメッセージ | トップページ | キリマンジャロはSQL Azureを救う »

2010年4月23日 (金)

ちょっと乗り遅れたけど部分メソッド(パーシャルメソッド)って良さそう

VB2010がリリースされました。新機能を眺めていて部分メソッド(パーシャルメソッド)が目に付きました。

部分メソッドは2008から導入されたので、2010の新機能というわけではありませんが、今までほとんどスルーしていていました。

今回、VB2010リリースを気に改めて試してみると「結構良いのでは?」と思えたので紹介します。

もう使っているかもしれませんが、基本から説明すると、部分メソッドとは空のメソッドを宣言だけしておいて、その中身は別の場所にプログラム(実装)するという手法、機能のことです。

Public Class Business

    Public Sub DoBusiness()

        WriteLog(CreateMessage)

    End Sub

    Partial Private Sub WriteLog(ByVal message As String)
    End Sub

    Private Function CreateMessage() As String
        Return "ログです。"
    End Function

End Class

この例ではWriteLogが部分メソッドです。ただの空のメソッドだと本当に単なるダミーになってしまうのですが、キーワードPartialをつけて、中身は別の場所でプログラムするということを明示します。

Partialをつけてるのに、ここでメソッドの中身を書くとエラーになります。

で、ここから重要です。

このプログラムを実行してDoBusinessメソッドを実行すると、CreateMessageメソッドは呼び出されません。

WriteLogメソッドも呼び出されないのですが、そこはそれほど驚きはなく、CreateMessageメソッドが呼び出されないのが私にとっての驚きです。

WriteLogメソッドの実装がみつからないので、WriteLogメソッドの呼び出しはコンパイル時点で省かれてしまうのです。そのため、引数を生成するためのCreateMessageメソッドの呼び出しも省かれます。

これはすごいと思いました。従来、似たような実装をしても呼び出しは行われてしまうのでCreateMessageメソッドは実行されてしまいます。

部分メソッドにしておけば、実装を省くと呼び出し自体が行われなくなるので、多少コストのかかる処理でも部分メソッドにしておいてじゃんじゃん書いてOKということになります。

システムを作っている真っ最中はプログラム中にいろいろとログをしかけて挙動を確認したり、デバッグしたりしたいものですが、あまり大量に仕込むとパフォーマンスに影響しますし、後でその部分を削除するのも大変です。

ログ書き込みメソッドの中だけ後で空にするという方法もありますが、呼び出し自体は行われるのでコスト的には不利です。特にログ書き込みメソッド本体よりも、そのログの内容を生成するための呼び出しが気になります。

逐一#If Debugなどをつけてデバッグ時のみに限定して動作させる技もありますが、これはプログラムが汚くなる上に量が多いとモチベーションが下がります。

部分メソッドは完全にコストがゼロになるので完成時のことをそれほど考慮しないで、開発やデバッグのためだけにいろいろとログを仕込むことが出来ます。

しかも、このまま本番にリリースしてからバグが出た場合、実装部分を含んだリリースビルドを提供すれば開発時に使用していた詳細なデバッグログを本番でも出力することが出来て問題解決の役に立ちそうです。

このように必要なときと必要じゃないときを切り替えて、実行コストで不利にならないように出来るというのが魅力と思いました。

実装部分のコードも載せておきます。実装部分は別ファイルでよいのです。(同じファイルでもよいですが)

Partial Public Class Business
    Private Sub WriteLog(ByVal message As String)
        Debug.WriteLine(message)
    End Sub
End Class

それにしても、部分メソッドで名前が良くないですね。「部分」ってゆーよりはダミーという感じがします。宣言と実装を分離できる、「分離メソッド」なんて言う名前でもいいかもしれません。

「部分」メソッドなどといわれると、1つのメソッドの内容をあっちに書いたり、こっちに書いたり出来るのかと思ってしまいます。

あと、念のため。別にログのためにある機能ではありません。私はまっさきにログで使ったらいいんじゃないかと思っただけで他にも使えるシーンはたぶんあると思います。

|

« Visual StudioでAzureプログラミングをするときの基本的なエラーメッセージ | トップページ | キリマンジャロはSQL Azureを救う »

Visual Basic」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/197542/48156573

この記事へのトラックバック一覧です: ちょっと乗り遅れたけど部分メソッド(パーシャルメソッド)って良さそう:

« Visual StudioでAzureプログラミングをするときの基本的なエラーメッセージ | トップページ | キリマンジャロはSQL Azureを救う »