Visual Basic での開発の嘘
巷では,特に管理者層の間では,「Visual
Basicを使うと,開発効率が上がる」と盲目的に考えられている部分がありますが,そんなことはありません。
確かに「とりあえず動くものを作る」のは,非常に楽です。しかし,「きちんと動くものを作る」のは,Visual
Basicを使っても楽になるとは限りません。
Visual Basicが効果を発揮するのは,次のような部分に限られます。
-
画面の外枠の作成。
間違っても,画面全体の作成ではありません。「アプリケーションで必要な画面表示を提供してくれる,既存のカスタムコントロール」が存在してこそ,Visual
Basicは威力を発揮します。
実際に,私が過去に関わったプロジェクトでは,「画面仕様書に書かれた使用を満たすカスタムコントロールが無かったため,結局コントロールからC++で作成し直した」場合がありました。
-
プロトタイプの作成。
これは,よく言われてる事ですね。
-
コンポーネントを組み合わせた処理。
もっと言えば,ActiveX(OLE)オブジェクトを組み合わせて行う処理。
ある意味バッチファイル的なものと言えるかもしれません。
-
半自動のメモリ管理。
このおかげで,不用意に変なメモリを潰して,怪しい動きになってしまうことは基本的にありません。
逆に言えば,malloc相当の事すらできないわけで,特に不定形のデータを処理する場合は,C++のように,簡単にごまかすことができないということでもあります。
逆に,Visual Basicを使ったためにやりにくくなるのは,次のような部分です。
-
速度
これは仕方がありません。問題なのは,「パフォーマンスが必要とあらかじめ分かっているにもかかわらず,Visual
Basicで作ろうとする」開発者・設計者の姿勢です。少なくとも,現状のVisual
Basicでは,マルチスレッド化してごまかすこともできません。
-
マクロが無い
ある意味,このおかげで,とっつきやすい部分があるのかもしれませんが,小細工をしにくい部分があります。
-
エラー処理
Visual Basicが検出したエラーは,関数などの戻り値ではなく,イベントとして処理されます。
実際に困る原因なのは,「エラー処理をきちんと行わないと,あらゆる所で実行時エラーとなり,いきなり終了してしまう」事です。私の今までの経験では,「インデックスの範囲が不正です。」「型が一致しません」「オブジェクト変数または
With ブロック変数が設定されていません」のエラーで終了してしまうのが御三家でした。
また,このエラー処理というのも,On Error Goto文でイベントを処理するか,On
Error Resume Next文でとりあえずエラーを無視してから,後からステータスを参照するかのどちらかです。
エラーを特に処理する必要が無くても,「エラーを無視する」という事を関数ごとに記述する必要があります。一方,基本的にC言語ではエラーを無視する場合には,何もしなければいいだけです。
On Error Goto 文は,C++で言えば「構造化例外処理」に当たりますので,C育ちの人よりは,大昔のパソコンBasic出身者のほうがとっつきやすいかもしれません。。
-
特に,C++の関数に渡す文字列の扱いが厄介
これは,文字列としてBSTR型やUnicodeを使用しているためです。例えば,文字列の(ASCIIコードでの)バイト数を計算する場合には,次のようにする必要があります
-
文字数分ループ
-
ASC(Mid$(文字列,カウント,1))が255以下なら,1,それ以上なら2を足す。
-
以上を文字列の最後の文字まで繰り返し。
-
別のVisual Basicで書かれたDLLとのインターフェースに,構造体を使えない。
必要なら,構造体をすべてクラスとして置き換える必要があります。ここでも,結局OLEの知識が要求されてきます。
(C++などよりははるかに)習得しやすい言語仕様にもかかわらず,きちんと動作させるには,結局いろいろ考慮しなければいけない点があり,それらの大部分はOLEにまつわる部分です。
ユーザーインターフェースに関しても,場合によっては,Visual
Basic のほうが苦手なユーザーインターフェースもあります。これは次のようなものです。
-
ショートカットメニュー
-
ステータスバー
-
(特にドッキング可能な)ツールバー
-
1データに対して複数の参照・更新可能なウインドウが同時に開ける形
ステータスバーもツールバーも,確かにVisual Basicには存在します。ですが,試しに「メニューとツールバーとショートカットキーに,ある条件によって有効・無効が変化するコマンドがある場合の有効・無効の切り替え処理」を,MFC(VC++)とVisual
Basicで作ってみてください。前者のほうが,圧倒的に自分で書かなければいけないコード量が少なくて済みます。これは,Visual
Basicでは「ツールバーのボタン」「メニュー項目」「ショートカットメニュー」等の入力要素に対して状態を設定するのに対して,MFCでは,「機能」に対して状態を設定するからです。「機能」に対して状態を設定すると,その機能の実行トリガとなる入力要素全てに状態を設定する機能が組み込まれているからです。逆に言うと,Visual
Basic の場合は,この機能を「自前で実装」しなければいけません。(しかも,MFCのように汎用的なものにするのはさらに大変です。)
以前は「他の言語(例えばC++)より,初心者が開発しやすい」という点がありましたが,フリーウェアや単発ツールならいざ知らず,システムの開発で,1サブシステムが(特に計算主体の処理を)丸まるVisual
Basicを使うのは適切ではないと考えます。DLL1つ作るだけにしても,上で書いたようにプログラマにある程度のOLEの知識を要求するからです。(設計レベルでコンポーネントとして分割されていない場合はプログラマが独自でコンポーネントの設計を行う必要があるため特にそうです。)
おまけにVer4,Ver5となるにつれて,ますますOLEとの関連度が高くなっています。(文字列をBSTR型で管理するとか,文字をUNICODEで扱うとか)
例として,あなたは「オブジェクトの永続期間」という言葉を聞いて,何の事か判るでしょうか?
また,あなたの設計orコーディングしたモジュールでは,グローバル変数を使用していますか?
「オブジェクトの永続期間」が判らずにグローバル変数を使用しているなら,あなたはVBでDLLを設計・コーディングしたり,VBのDLLを使用したりしてはいけません。既にその時点で,あなたはバグを構造的に含めてしまっています。
今までの関わってきたプロジェクトからは,
「VisualBasicをメインで開発するなら,機能設計・分割だけでなく,コンポーネント構成の設計・分割も必要だ」
ということを感じました。Visual
Basicがメインのシステムを設計をされる方には,コンポーネントの集合として設計していただくことを強く望みます。また,開発を行う方たちは,OLE(Active-X)の勉強をしてください。
C++では,C言語として扱うことで(実際,私が今までに関わったシステムで,C++らしいプログラムは非常にわずかです。),コンポーネントとしての設計をせずに済ませることができましたが,VisualBasicではそうはいきません。
果たして,私が今関わっているプロジェクトはどうなるんでしょうか…とりあえず,1998年1月14日時点では,共通ライブラリ以外全てVBという,今までにも増してVB依存度が高くなっていますが,相変わらず「オブジェクト」とか「コンポーネント」とか言う話はさっぱり聞こえません。「関数」というのはよく聞くんですが…
Shinonome's known problems に戻る