特集

Visual Basic 2005へ移行する理由(中編)

VB6開発者にやさしいVB2005の言語仕様

om (takanao)(Microsoft MVP Oct 2005 - Oct 2006 Visual C#)
2006/01/07
Page1 Page2 Page3

 前回統合開発環境(IDE)の機能を中心にVisual Basic 2005(以下、VB2005)の進化を解説した。今回は読者が最も気になると思われる、Visual Basic 6.0(以下、VB6)やVisual Basic .NET(以下、VB.NET)と比べてVB2005の言語仕様やクラス・ライブラリが、どのように進化し、それがVB6開発者にとってどれほど使いやすいものになったかを説明する。特にWindowsアプリケーション開発における違いについて解説しよう。

 本稿では前回と同様に、章の見出しの末尾に以下のようなマークを付けてVB6からの変化の具合を示している。

    ……VB6開発者が移行しやすくなっている部分
    ……相変わらずVB6から移行しにくいと思われる部分
    ……どちらともいえない部分

 それでは次章から、VB2005での開発がVB6開発者に向けてどのように変化したかを解説していこう。なお本稿では先日開発者向けに公開されたVisual Studio 2005 Professional Edition日本語版 RTMのVB2005を使用している。

3. 開発

 読者諸氏がいまVS2005を起動可能ならば、実際に実行して動作内容や画面を確かめながら以下の解説を読み進めてほしい。

 まずはWindowsアプリケーションを新規作成する。これには、[新しいプロジェクト]ダイアログで、「Windowsアプリケーション」を選択して、[OK]ボタンをクリックする。[新しいプロジェクト]ダイアログはメニューバーから[ファイル]−[新規作成]−[プロジェクト]を選択することで表示できる。

 Windowsアプリケーションを開発するに当たって、始めに行うのはフォームのデザインである。ツールボックスからコントロールをドラッグ&ドロップするというスタイルは、VB2005でもほとんど変わっていない。

VB2005におけるWindowsアプリケーションのフォーム・デザイン
フォーム・デザインに大きな変化はない。[ツールボックス]ウィンドウからフォームへアイテムをドラッグ&ドロップで追加してフォームをデザインする。

 では、次にボタンをダブルクリックしてボタンのクリック・イベント・ハンドラを作成してみよう。

■3.1 フォームのデザインと生成されるコード

 VB6は非常に効率的に設計されていて、フォーム上にコントロールなどを配置したときも、コードにはイベント・ハンドラや関数など開発者が本当に必要なコードしか表示されていなかった。以下はVB6でフォーム上にボタンを配置してイベント・ハンドラを生成したコードの例である。ご存じのとおり余分なコードは一切書かれていない。

Private Sub Command1_Click()

End Sub
VB6で自動的に生成されるフォームの全体コード
シンプルで余計なコードが一切生成されない。この例ではイベント・ハンドラのみが生成されている。

 このような仕組みは効率的である半面、欠点もある。例えばVB6では完全なオブジェクト指向を採用していないため、フォームの継承ができない。同じようなフォームを作る場合でも、それぞれのフォームで毎回デザインを行う必要があったのである。このため、VB6ではフォームのデザインを統一したい場合や、業務で使用するフォームのデザインが限られている場合でも、同じようなデザインやコーディングをフォームの数だけ行う必要があり、非常に効率が悪かった。また、変更時もフォームの数だけ変更を繰り返す必要があった。

 VB.NETは、完全なオブジェクト指向言語に生まれ変わったため、例えばフォーム上に配置したコントロールなら、その生成や配置、各プロパティ設定などに関する処理コードがすべて生成されるようになり、確かにフォームの継承も可能になった。これによって、統一が必要なフォームのデザインを行った基底クラスを作成して、ほかのフォームは、基底のフォームを継承するだけで、同じデザインやコーディングを何度も行う負担から解放されると思われていた。

 だがこの機能を実現するために、VS.NETのフォーム・デザイナが自動生成するコード(=開発者が変更できないコード。以下、デザイン・コード)が、ソース・ファイル内に生成されることになってしまった。VB.NETでは、このようなコードを隠せるように、「#Regionディレクティブ」というキーワードが追加されているので、VS.NETのコード画面上では非表示にすることができる。だが、#Regionで隠されているとはいえ、触れてはいけないコードが勝手に自分のソース・ファイルに書かれていることに抵抗を感じたVB6開発者も多かっただろう。また、誤ってデザイン・コードを編集してしまって、フォームのデザイン画面が表示されなくなってしまうというトラブルも多かった。

 以下のコードは、VS.NETが自動的に生成する、VB.NETのデザイン・コードである。

Public Class Form1
  Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "

  Public Sub New()
    MyBase.New()

    ' この呼び出しは Windows フォーム デザイナで必要です。
    InitializeComponent()

    ' InitializeComponent() 呼び出しの後に初期化を追加します。

  End Sub

  ' Form は、コンポーネント一覧に後処理を実行するために dispose をオーバーライドします。
  Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
    If disposing Then
      If Not (components Is Nothing) Then
        components.Dispose()
      End If
    End If
    MyBase.Dispose(disposing)
  End Sub

  ' Windows フォーム デザイナで必要です。
  Private components As System.ComponentModel.IContainer

  ' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
  'Windows フォーム デザイナを使って変更してください。
  ' コード エディタを使って変更しないでください。
  Friend WithEvents Button1 As System.Windows.Forms.Button
  <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
    Me.Button1 = New System.Windows.Forms.Button
    Me.SuspendLayout()
    '
    'Button1
    '
    Me.Button1.Location = New System.Drawing.Point(0, 0)
    Me.Button1.Name = "Button1"
    Me.Button1.TabIndex = 0
    Me.Button1.Text = "Button1"
    '
    'Form1
    '
    Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
    Me.ClientSize = New System.Drawing.Size(292, 266)
    Me.Controls.Add(Me.Button1)
    Me.Name = "Form1"
    Me.Text = "Form1"
    Me.ResumeLayout(False)

  End Sub

#End Region

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

  End Sub
End Class
VB.NETが自動的に生成するデザイン・コード
開発者が編集してはいけないデザイン・コード(太字部分)が大量に出力されている。

 このような問題を解決するために、VB2005では、部分クラス(Partial Class:パーシャル・クラス)と呼ばれる機能が追加された。Partialとは、「部分的な、不完全な」という意味であり、その名のとおり、複数のファイルに分かれた部分的なコードを組み合わせて1つのクラスを作成することができる。

 VB2005では、この機能を使って、デザイン・コード用のファイルと、開発者がコードを記述するためのファイルという2つのファイルに分割してクラスを実装することにした。そして、ビルドを行うときに2つのファイルを合わせて1つの完全なクラスを実現する。これによって開発者が編集するファイルのコード内容は、以下のようにVB6に近くなっている。

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    End Sub
End Class
VB2005で自動的に生成されるフォームの全体コード(フォームの例)
VB.NETでは生成されていたデザイン・コードがなくなって、すっきりしたコードになっている。

 VB.NETと比較するまでもなく、すっきりとしたコードになっている。VB.NETで必要だったFormクラスの継承宣言であるInheritsステートメントも存在していないし、C# 2.0で必要なPartialの宣言も省略されている。このように、記述を簡潔にすることでVB6開発者の抵抗を減らそうとしているのだと考えられる。

 それではフォームのデザインが終わったら、次は別のフォームを開いていこう。

■3.2 フォームのインスタンス化処理

 VB6ではフォームの名前は、「クラス名」と「(暗黙の)フォームのインスタンス名」という2つの意味を持っていた。VBが開発された当初、フォームは暗黙のインスタンスで呼び出していた。バージョンを重ねてオブジェクト指向の考えを盛り込んだ結果、「Dim frm As New Form1」といった、クラスのような利用も可能になった。だが、このような呼び出し方ができるようになっても、互換性を維持するために「Form1.Show」のように暗黙のFormインスタンスを呼び出すことができた。このためVB6開発者の多くは、フォームのインスタンスを作成するのではなく、暗黙のインスタンスを使い続けた。

 ところがVB.NETになって、完全なオブジェクト指向言語として再設計されたため、暗黙のインスタンスは使用できなくなった。フォームの変数を宣言して、フォームを記述したクラスをインスタンス化してから呼び出すことを強要された。VB6のプロジェクトをアップグレード・ウィザードでアップグレードした場合は、暗黙のインスタンスを疑似的に実現するコードが生成されたが、新規でプロジェクトを作成した場合は、フォームをインスタンス化して呼び出さなくてはならなくなった。

 これに強い抵抗を感じたVB6開発者は多かった。これまでとまったく異なるコードを記述してフォームを呼び出さなくてはならないのだ。この時点でVB.NETへの移行をあきらめたVB6開発者も多かっただろう。

 VB2005では、暗黙のフォーム・インスタンスが復活することになった。オブジェクト指向を理解した開発者からは反対の声も大きいものの、VB6開発者から見ると、既存の知識で開発を行うことが可能なため、移行がスムーズに行えるのではないだろうか。ただし、フォームが破棄されるタイミングが明確でなくなったり、フォームのスコープが広くなってしまうなど、さまざまな問題があるため、筆者の個人的な意見としては、やはり暗黙のインスタンスを使用するのではなく、きちんと宣言をして使ってほしい。


 INDEX
  [特集]Visual Basic 2005へ移行する理由
  VB2005は.NETへの移行を加速できるのか!?
    1.なぜVB6開発者はVB.NETに移行しなかったか?
    2.互換性が高まった開発環境
 
  VB6開発者にやさしいVB2005の言語仕様
  1.フォームのデザインと生成されるコード、フォームのインスタンス化処理
    2.Myオブジェクト、コード・スニペット、配列の下限指定、暗黙の型変換
    3.デフォルト・プロパティ、オブジェクトの解放、エディット&コンティニュー
   
  VB6開発者が待ち望んだVB2005の便利機能
    1. 進化したデータ・アクセス機能とアプリケーションの配布技術
    2. 完成度を高めた移行ウィザードとまとめ
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH