Visual Studio がプログラマブル Web を可能に: 言語の革新
最終更新日: 2000/04/27
はじめに
エンタープライズ Web アプリケーションの迅速な構築のためには、開発者はスケーラブルで堅牢で再利用可能なビジネス ロジックに依存しなければなりません。過去数年にわたって、オブジェクト指向プログラミングは、これらの要件を満たすシステムを構築するための主要な方法論になりつつあります。オブジェクト指向プログラミング言語の使用は、大規模システムの理解を容易にし、デバッグを単純化し、更新の迅速化に役立ちます。
Visual Basic® は、Windows アプリケーションの迅速な開発のための標準となっていますが、オブジェクト指向言語機能の欠如のために、中間層コンポーネントの作成についてはあまり受け入れられていません。この問題を解決するために、次世代の Visual Basic では、エンタープライズ Web アプリケーションの開発を単純化するオブジェクト指向言語機能が追加されます。これらの新しい言語機能により、Visual Basic は、この開発ツールを世界で最も普及させる原動力となった親しみやすさはそのままに、C++ または Java のパワーのすべてを引き出します。
次世代の Visual Basic は、継承、カプセル化、ポリモーフィズム (多態性) などの新しい機能を備えた第一級のオブジェクト指向プログラミング言語を提供します。さらに、開発者は、明示的なフリー スレッディングによって、スケーラビリティの高いコードを作成することができ、また、構造化例外処理などの近代化言語構造の追加によって、保守性の高いコードを作成できるようになります。Visual Basic は、以下の新しい機能によって、堅牢でスケーラブルな分散 Web アプリケーションの作成に必要なすべての言語特性を提供します。
新しいオブジェクト指向プログラミング機能
追加の近代化言語機能
言語革新の歴史
Visual Basic 言語は、Windows® プラットフォームの基本的な変化に対応する長い更新履歴を持っています。たとえば、Windows 3.0 GUI 開発をサポートするために QuickBasic® に大幅な変更を加えたのが、Visual Basic の最初のリリースにつながりました。Visual Basic 4.0 では、COM ベースのプログラミングへの移行が、DLL 作成のための言語構造をもたらしました。そして Visual Basic 5.0 では、COM コントロールの作成をサポートするようになりました。
このように Visual Basic は多くの改訂を重ねてきましたが、そのたびに Visual Basic の人気は高まっていきました。新しい Visual Basic のオブジェクト指向言語機能がエンタープライズ Web アプリケーションを構築している開発者に提供するパワーによって、この傾向は今後も続くでしょう。
オブジェクト指向プログラミング
データが手続きコードとは別に格納される従来の構造化プログラミングには、いくつかの弱点があります。構造化コードとして書かれるコードは、モジュール方式ではありません。データ要素はどんなコードからでもアクセス可能なので、開発者の知識がなくてもデータを変更することが可能です。これが、デバッグが非常に難しい実行時エラーの原因となることがあります。さらに、保守作業が非常に慎重を要するものとなります。構造化プログラミングでは、1 行のコードの変更が全体にどのような影響を与えるかを理解するのは、非常に難しいことです。最後に、プログラマがコードとデータの両方を管理しなければならないため、再利用の割合が低くなります。
オブジェクト指向プログラミング(Object Oriented Programming: OOP)は、これらの問題を解決します。OOP は、データとそのデータに対して作用するメソッドをオブジェクトと呼ばれる単一のユニットにパッケージ化します。オブジェクトのデータは、無許可の変更を防ぐために隠蔽することができます。オブジェクトは、このデータに対して動作するパブリック メソッドのセットを表面に出します。この概念をカプセル化といいます。実装の詳細がインターフェイスから切り離され、オブジェクトを呼び出すコードをだめにしてしまう可能性がなくなるため、下層のプログラミング ロジックの変更も安全に行うことができます。
OOP では、開発者は継承によってコードとデータを再利用することができます。定義済みのオブジェクトから継承することによって、開発者は複雑なアプリケーションを短時間で構築することができます。新しいコードの作成には、常にバグが混入する可能性がつきまとうので、テスト済みのコードを再利用することで、新しいバグの発生を低く抑えることができます。
これらのニーズを満たすために、次世代の Visual Basic は追加の言語機能を提供し、前述のすべての利点を備えた第一級のオブジェクト指向プログラミング言語となります。
継承
Visual Basic に対して常に最も要望が多い機能は、実装の継承のサポートです。インターネット時間での開発には、迅速なアセンブリと大規模な再利用が必要です。実装の継承を容易にするために、Visual Basic では Inherits キーワードが追加されます。
開発者は新しいキーワード Inherits またはクラス プロパティ シートの Inherits プロパティを使用して、既存のクラスから派生することができます。
Class1
Function GetCustomer()
...
End Function
Class2
Inherits Class1
Function GetOrders()
...
End Function
Inherits ステートメントは、継承に関連する通常のプロパティのすべてをサポートします。
- 派生クラスのインスタンスは、基底クラスによってサポートされるすべてのメソッドとインターフェイスをサポートします。
- 派生クラスは、 Overrides
キーワードを使用して、基底クラスで定義されたメソッドをオーバーライドすることができます。
- 派生クラスは、基底クラスによってサポートされるメソッドとインターフェイスのセットを拡張することができます。
カプセル化
カプセル化は、開発者が内部データ構造やコードなど、オブジェクトに関する情報を包含し、隠蔽できることを意味します。カプセル化は、アプリケーションの残りの部分からオブジェクトの動作の内部の複雑さを切り離します。
たとえば、コマンド ボタンの Caption プロパティを設定するとき、文字列の格納方法を知る必要はありません。Visual Basic では、このために、プロパティとメソッドを「保護されたプライベート」または「パブリック」として宣言できるようになっています。
なぜクラス メンバを保護する必要があるのでしょうか?クラスの特定のプロパティがオブジェクトの状態を表していると仮定します。それらのプロパティがクラスの外から直接アクセスされるのを防ぐことができない場合、そのオブジェクトの状態をどうやって保証できるでしょうか? プロパティを保護した場合、そのプロパティに値を割り当てるためのカスタム メソッドを作成することができます。そのメソッドは、値が正しく設定されていることを確認する検証コードを含むことができます。プロパティ値が割り当てられるのは 1 か所だけなので、コードのデバッグと保守がはるかに容易になります。下の例では、"me" はクラスの特定のインスタンスを参照します。
Protected cName as string
Protected Function ChangeName(NewName)
Me.cName = NewName
End Function
オーバーロード
オーバーロードとは、オブジェクトのメソッドと演算子がコンテキストに応じて異なる意味を持つことができるという機能です。演算子は、オペランドのデータ型やクラスに応じて、異なる振る舞いをとることができます。たとえば、x+y は、x と y が整数か構造体かによって別のことを意味します。オーバーロードは、異なるデータ型に作用するプロシージャに同じような名前を使う必要があるオブジェクト モデルで特に便利です。たとえば、いくつかの異なるデータ型を表示するクラスは、次のような表示プロシージャを持つことができます。
Overloads Sub Display (theChar As Char)
...
Overloads Sub Display (theInteger As Integer)
...
Overloads Sub Display (theDouble As Double)
オーバーロード機能がない場合には、同じことを行うプロシージャでも、それぞれのプロシージャに個別の名前を作成する必要があります。
Sub DisplayChar (theChar As Char)
...
Sub DisplayInt (theInteger As Integer)
...
Sub DisplayDouble (theDouble As Double)
ポリモーフィズム
ポリモーフィズム (多態性) とは、オブジェクトのデータ型またはクラスに応じて、オブジェクトの処理を変えられることをいいます。さらに、この機能によって、派生クラスのメソッドを再定義することができます。たとえば、Employee という基底クラスがあった場合、ポリモーフィズムによって、プログラマは Hourly、Salaried、Commissioned など、任意の数の派生クラスに対して複数の PayEmployee メソッドを定義することができます。オブジェクトがどのタイプの Employee であっても、PayEmployee メソッドを適用すれば、正しい結果が返されます。
Class Employee
Function PayEmployee()
PayEmployee = Hours * HourlyRate
End Function
Class CommissionedEmployee
Inherits Employee
Overrides Function PayEmployee()
PayEmployee = BasePay + Commissions
End Function
パラメータ化コンストラクタ
パラメータ化コンストラクタ(または単に "コンストラクタ")では、クラスの新しいインスタンスを作成すると同時に、その新しいインスタンスに引数を渡すことができます。コンストラクタによって、インスタンスの作成者はユーザー定義の作成コードにパラメータを渡すことができるので、コンストラクタはオブジェクト指向プログラミングに欠くことができません。コンストラクタでは、新しいオブジェクトのインスタンスの作成と初期化を 1 つの式で行うことができるので、クライアント コードが単純化されます。
追加の近代化言語機能
次世代の Visual Basic では、より堅牢でスケーラブルなアプリケーションの開発を単純化する多くの構成概念が追加されます。これらの機能には、言語でのタイプセーフ、イニシャライザなどの生産性機能、関数ポインタなどが含まれます。このように言語が拡張されることで、Visual Basic 言語の機能はさらに包括的なものになります。
フリー スレッディング
現在、開発者が Visual Basic でアプリケーションを作成するとき、彼らが書くコードは同期的です。すなわち、前の行のコードが実行されてからでなければ、次の行を実行することはできません。Web アプリケーションを開発するときには、スケーラビリティが重要になってきます。開発者には、同時処理を可能にするツールが必要です。
フリー スレッディングが含まれることで、開発者はスレッドを分岐生成して、アプリケーションの残りが続行している間に時間のかかるタスクを実行したり、複雑なクエリーを実行したり、複雑な計算を行って、非同期処理を提供することができます。
Sub CreateMyThread()
Dim b As BackGroundWork
Dim t As Thread
Set b = New BackGroundWork()
Set t = New Thread(New ThreadStart(AddressOf b.Doit))
t.Start
End Sub
Class BackGroundWork
Sub DoIt()
・
End Sub
End Class
構造化例外処理
エンタープライズ アプリケーションの開発には、再利用可能で保守性の高いコンポーネントの作成が必要です。Visual Basic の過去のバージョンでは、Basic 言語の課題の 1 つがエラー処理のサポートでした。今まで、開発者はすべての関数とサブルーチンにエラー処理コードを用意しなければなりませんでした。開発者は、一貫したエラー処理とは多くの重複コードを意味することに気づきました。既存の On Error GoTo ステートメントによるエラー処理は、大規模アプリケーションの開発と保守を遅らせることがあります。名前そのものが、このような問題を反映しています。つまり、GoTo が暗示しているように、エラーが発生したときには、制御はサブルーチンの中のラベルが付けられた位置に移されます。エラー コードが実行されたら、標準の GoTo によって別のクリーンアップ位置に移されなければならず、そして最後に、さらに別の GoTo またはプロシージャからの Exit を使用しなければなりません。Resume と Next のさまざまな組み合わせによってさまざまなエラーを処理すると、コードが読みにくくなり、実行パスが完全に通っていなければ頻繁なバグにつながります。
Try...Catch...Finally を使えば、このような問題はなくなります。開発者は例外処理を入れ子にすることができ、正常条件でも例外条件でも実行されるクリーンアップ コードを書くための制御構造が実現します。
Sub SEH()
Try
Open "TESTFILE" For Output As #1
Write #1, CustomerInformation
Catch
Kill "TESTFILE"
Finally
Close #1
End try
End Sub
タイプセーフ
現在、Visual Basic 言語は、それが生成する暗黙的な型の強制という点では、非常にリベラルです。代入に関して、また、参照以外のパラメータの受け渡しに関して、Visual Basic コンパイラでは、実行時の強制を生成することによって、ほとんどどんなデータ型でも別の型に変換することができます。変換される値がデータの損失なしには変換できないという場合には、実行時強制変換操作は失敗します。新しいコンパイル オプションの追加によって、Visual Basic は、実行時にエラーとなる可能性がある変換についてコンパイル時エラーを生成することができます。OptionStrict は、実行時に失敗するおそれがある変換が必要なとき、または数値型と文字列型の間の自動変換のように、ユーザーが予期しない変換が必要なときにエラーを生成することによって、タイプセーフ性を高めます。
共有メンバ
共有メンバとは、クラスのすべてのインスタンスによって共有されるクラスのデータおよび関数メンバです。継承を備えた Visual Basic アプリケーションでは、データ メンバまたは関数の 1 つのインスタンスをクラスのすべてのインスタンスの間で共有する必要があります。共有データ メンバとは、クラスのすべてのインスタンスが共有するデータ メンバです。共有データ メンバは、クラスの特定のインスタンスとは無関係に存在します。共有メソッドは、通常のメソッドと違って、暗黙のうちにクラスのインスタンスに渡されることはありません。このため、共有メソッドでは、非共有データ メンバへの非修飾参照は許されません。パブリック共有メンバはリモートからアクセスすることができ、クラスのインスタンスからレイトバインドできます。
イニシャライザ
次のバージョンの Visual Basic は、変数の宣言行での初期化をサポートします。イニシャライザは、制御構造内を含めて、どこでも使用することができます。イニシャライザを含むプロシージャ レベルの宣言は、宣言ステートメントの直後に代入ステートメントを続けることと同じです。言い換えると、
Dim X As Integer = 1
というステートメントは、以下のステートメントと同じです。
Dim X As Integer
X = 1
まとめ
Visual Studio .NET® では、Visual Basic は継承、カプセル化、およびポリモーフィズムを備えた第一級のオブジェクト指向プログラミング言語を提供します。さらに、開発者は明示的なフリー スレッディングによって、スケーラビリティの高いコードを作成できるようになります。開発者が書くコードは、構造化例外処理などの近代化言語構造の追加によって、保守性の高いものになるでしょう。Visual Basic は、堅牢でスケーラブルな分散 Web アプリケーションの作成に必要なすべての言語特性を提供します。
|