Visual Basic での開発の嘘  

 
 巷では,特に管理者層の間では,「Visual Basicを使うと,開発効率が上がる」と盲目的に考えられている部分がありますが,そんなことはありません。
 確かに「とりあえず動くものを作る」のは,非常に楽です。しかし,「きちんと動くものを作る」のは,Visual Basicを使っても楽になるとは限りません。
 Visual Basicが効果を発揮するのは,次のような部分に限られます。

  1. 画面の外枠の作成。

  2. 間違っても,画面全体の作成ではありません。「アプリケーションで必要な画面表示を提供してくれる,既存のカスタムコントロール」が存在してこそ,Visual Basicは威力を発揮します。
    実際に,私が過去に関わったプロジェクトでは,「画面仕様書に書かれた使用を満たすカスタムコントロールが無かったため,結局コントロールからC++で作成し直した」場合がありました。
  3. プロトタイプの作成。

  4. これは,よく言われてる事ですね。
  5. コンポーネントを組み合わせた処理。

  6. もっと言えば,ActiveX(OLE)オブジェクトを組み合わせて行う処理。
    ある意味バッチファイル的なものと言えるかもしれません。
  7. 半自動のメモリ管理。

  8. このおかげで,不用意に変なメモリを潰して,怪しい動きになってしまうことは基本的にありません。
    逆に言えば,malloc相当の事すらできないわけで,特に不定形のデータを処理する場合は,C++のように,簡単にごまかすことができないということでもあります。
 逆に,Visual Basicを使ったためにやりにくくなるのは,次のような部分です。  (C++などよりははるかに)習得しやすい言語仕様にもかかわらず,きちんと動作させるには,結局いろいろ考慮しなければいけない点があり,それらの大部分はOLEにまつわる部分です。

 ユーザーインターフェースに関しても,場合によっては,Visual Basic のほうが苦手なユーザーインターフェースもあります。これは次のようなものです。

 ステータスバーもツールバーも,確かに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 に戻る