VB.NETでコーディングするなら事前バインディングで使って下さい何でもしますから!

f:id:Cat_Of_STELLA:20170727215101j:plain

一昔前、VB6からVB.NETに移行する案件のソースレビューを経験したのですが、なんとまあ新しく書かれたソースに対して特別な感情を抱かざるを得ないという状況になりました。マイグレーションでは無く、システムリプレースだったのですが、「ソースそのまま移しかえればいいんでしょ」というVBに対して軽いノリで移行していたプログラマーが多過ぎて発狂しそうになりました。

その中でもCSVファイルの読み書きのところで新ソース上でCOM使うとか何考えてるのかわからない...ああ、今からでも遅くないからこの記事を読んで頂きたい...そしてこれからマイグレーションやシステムリプレースに遭遇するだろうエンジニア各位に少しでも力になれることを祈って...

バインディングとは(読み飛ばしてOK)

「バインディングとは~」ということを知りたくて事前バインディングを調べてる人は少ないと思います。恐らく、上司や先輩から「COM使うのやめろ」とか「遅延バインディングやめて事前バインディングにしろ」とか言われてるので、知りたいのは「どうすれば事前バインディングになるのか」ということですよね。

まあ、全く知らなくても良いという事は決して無いので頭の片隅に置いて頂きたいのですが、端的に言うと「変数に代入している時に何か処理している!」くらいで良いです。説明するとバインディングだけで連載出来ちゃうレベルなので、今回は割愛します。恐らく、早くソース直したい人が多いと思うので、サクッと行きましょう。バインディングの簡単な説明は後半で記述します。

遅延バインディングと事前バインディングの実装

VB.NETのソースと合せて記述するとこんな感じです。ファイル操作を例にしています。

【VB.NET】

 遅延バインディング

 Dim objFSO As Object
 objFSO = CreateObject("Scripting.FileSystemObject") 

 事前バインディング

 Dim objFSO As FileSystemObject
 objFSO = New FileSystemObject

【VB6】

 遅延バインディング

 Dim objFSO As Object
 Set objFSO = CreateObject("Scripting.FileSystemObject")

 事前バインディング

 Dim objFSO As FileSystemObject
 Set objFSO = New FileSystemObject

 はい、これだけです。遅延バインディングは変数宣言の時にObject型で宣言して、事前バインディングでは変数宣言の時にFileSystemObject型で宣言しています。また、変数に代入する時も遅延バインディングでは「CreateObject」を使用して代入、事前バインディングではnewしてインスタンスを代入しています。要は、宣言する時に型指定してnewしてインスタンス代入すれば事前バインディングです。

遅延バインディングと事前バインディングの違い

ここからは解説なので急が無い方だけで大丈夫です。急いでる方はコーディング頑張って下さい!

バインディングとは変数に代入する時に実行される処理です。私もコアな部分のことは分かりません。難解なMSDNを読んで頑張って下さい。それを先にするか後にするかの違いで事前バインディング(先にする)と遅延バインディング(後にする)と呼ばれます。

事前バインディングは特定のオブジェクト型に対して前もって変数の型を決めておくことです。上記の記述にもあるように、変数の宣言時にFileSystemObject型を指定しています。指定した型のインスタンスしか代入出来ないのですが、コンパイルエラーとして検知出来るので、実行時エラーを防げます。というか、型とインスタンスは一致して当然なので、教科書通りの書き方と言えます。

遅延バインディングの場合、型をObject型として宣言しています。つまり、変数に代入すると、どんな方のオブジェクトでも代入されてしまうわけです。事前に型が分からないので、代入時に解釈が必要です。時間がかかりますよね。実行時バインディングと言われてる所以です。そして実行時にエラーかどうか初めて認識出来ます。しかも、IDEのコード補完機能が使えないというデメリットもあります。ネガキャンしたいわけではありませんが、事前バインディングの方がメリットがあります。

日常に例えると、「株式会社○○営業部所属の△△さんが10時に打ち合わせのため来社する」が事前バインディングで、「誰かが10時に来社する」が遅延バインディングです。誰が来るのかを事前に知っておけば打ち合わせの準備も出来て、打ち合わせもスムースに出来ますが、誰かが10時来るけど来てからでないと分からない状態だと、仕事もスムースに進みません。来客が見えてから準備なんて失笑ものですからね。

まとめとお願い

事前バインディングは型指定してnew、遅延バインディングはObject型の変数にCOM使用ということを覚えておいて下さい。使い方自体は調べればいくらでも出てきます。そして事前バインディングを使って下さい!ソース改修する側の人間としては、COM使用しているVB.NETをチクチクと改修するのは非常に手間です。もっと言うと、上記のソースでファイル操作を挙げてますが、ファイル操作であれば、StreamReaderで読み込んでStreamWriterで書き込みして欲しいです!お願いします何でもしますから!