連載プロフェッショナルVB.NETプログラミング
|
クラス・ライブラリの価値
初期のBASIC言語には、ライブラリという概念はなかった。単純に、言語に組み込まれた機能を用いて、プログラムを作成するだけのものであった。しかし、汎用性のあるプログラムの断片を効率よく再利用することに対するニーズから、徐々に、ソース・コードをライブラリ的に利用するための機能が付け加えられてきた。例えばVB 6(Visual Basic 6.0)のモジュール機能はその一例といえる。モジュールとして記述されたコードは、容易にほかのプロジェクトに取り込んで利用できる。COMオブジェクトも、汎用的なプログラムの一部を再利用するのに都合のよい機能であった。また、Visual Basic用の汎用ライブラリのようなソフトウェア製品も販売されるようになった。
しかし、VB 6では、主要な機能は言語仕様の一部として組み込まれていたり、専用のCOMオブジェクトとして提供されたりするものが多く、ライブラリは限定的にしか成熟、成長してこなかったといえる。ところがVB.NET(Visual Basic .NET)では、特定のプログラム言語専用ではない汎用のクラス・ライブラリが標準で提供されることで、状況が大きく変化した。もはや、VB専用の小さく居心地のよい、しかし猥雑でほかのプログラム言語のプログラマーからは見通しにくい世界に安住することはできなくなってしまったのである。
プログラム言語を限定しないクラス・ライブラリにはどんな長所があるのだろうか。その答は簡単だ。VB 6の時代、ライブラリといえば、VB用、C用、Java用などプログラム言語ごとに別個のライブラリを整備する必要があった。その結果、同じような機能をプログラム言語ごとに記述する必要があり、効率が悪かった。COMオブジェクトのような言語に依存しないライブラリの作り方もあったが、COMオブジェクトはVBからの利用は容易であるものの、ほかの言語から利用する場合はVBに比べて手間が多く、COMオブジェクト以外の方法が選択されることも珍しくなかった。しかし、本当の意味でプログラム言語を限定しないクラス・ライブラリということになれば、1個の機能は1回コーディングすれば終わりである。実際、VB 6から標準で呼び出せるオブジェクトの種類と.NET Frameworkが標準で持つクラスの種類を比較すれば、後者の方が大幅に増えていることが分かるだろう。もちろん、標準提供以外のクラス・ライブラリの種類も、プログラム言語を限定しない方が、はるかに多くのものを利用可能になることはいうまでもない。
さて問題は、クラス・ライブラリはどうすれば使えるのか、そして、これ使うことで何ができるのかということだ。それを今回は見てみよう。
クラス・ライブラリを使ってみる
VBは&演算子で文字列を連結することができる。例えば「"A" & "B"」は"AB"になる。とても分かりやすい機能だが、&演算子は内部的にはメモリの確保と解放を繰り返し発生させる可能性があるため、処理は速くはない。例えば、固定長の配列に文字列を入れて操作するC言語などに比べると、文字列処理の速度は見劣りしてしまうかもしれない。
このような問題に対処するために、クラス・ライブラリには、System.Text.StringBuilderというクラスが用意されている。これは、複数の文字列を合成して新しい文字列を生成する処理を高速に行う機能を持っている。
この2つの方法で、どれほどの速度差があるのか、実際に検証するプログラムを書いてみよう。以下がそれだ。
|
|
String型文字列とStringBuilder型文字列との処理速度を検証するサンプル・プログラム1 |
これを実行すると以下のようになる。
|
|
サンプル・プログラム1の実行結果 |
最初に結果を説明すると、1行目の「同じ値」という文字列は、確かに同じ結果が得られた場合に出力するようにコーディングされたものである。2行目は、&演算子を使用した場合の処理時間。3行目は、System.Text.StringBuilderクラスを用いた場合の処理時間である。見て分かるとおり、&演算子を用いた場合は約26秒を要しているのに対して、System.Text.StringBuilderクラスを用いた場合は、1秒もかかっていないということである。圧倒的な速度差といえる。
このような差があることを考えれば、文字列処理が遅すぎる個所に限ってでも、このようなクラス・ライブラリを活用する価値があるといえるだろう。この例は、速度差がメリットになる場合だが、機能がメリットになる場合もある。
プログラムについても解説しておこう。3行目は、繰り返す回数として、100,000回という値を変数に定義している。この回数だけ、1文字を追加するという作業を繰り返して時間を計測する。4行目は、2つのケースの開始時刻と終了時刻を保存する変数を宣言している。5〜10行目は&演算子を使った場合。11〜16行目は、System.Text.StringBuilderクラスを使った場合である。14行目のAppendメソッドは、引数の文字列を、インスタンスが内部に保持する文字列に追加する機能を持つ。なお、同じ文字を繰り返すだけなら、VBのString関数を使うという手もあるが、実際のプログラミング時には同じ文字だけを繰り返し追加することは多くないので、比較の対象には入れていない。あくまで、同じ文字を追加しているのは速度を見るためであって、本来はさまざまな文字が追加されることを前提としている。
VB.NETに慣れていないVBプログラマーなら、20〜21行目は戸惑うかもしれない。ここではDate型の変数にSubtractメソッドを使っているが、これはエラーではない。Date型は実はクラス・ライブラリのSystem.DateTime構造体の別名であって、このクラスのメソッドを呼び出せる。つまり、2つの日付時刻の差分を得るSubtractメソッドがSystem.DateTime構造体に存在するので、これを呼び出すことができる。差分は、System.TimeSpanクラスのインスタンスとして返されるが、ここでは、それに対してToString()メソッドを呼び出して文字列に直して出力している。これらの行も、クラス・ライブラリの恩恵を受けて機能しているのである。
INDEX | ||
連載 プロフェッショナルVB.NETプログラミング | ||
第20回 クラス・ライブラリの構造 | ||
1.クラス・ライブラリの価値 | ||
2.クラス・ライブラリの構造 | ||
3.プロジェクトのインポート | ||
「プロフェッショナルVB.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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|