連載:熱血VBプログラマ応援団 |
|
− 前回のご相談の概要 − |
|
|
前回はVisual Basic .NET(以降、VB.NET)によるXML Webサービスの作成に触れた後、XML Webサービスの持つ暗黒面の1つ、呼び出しに時間がかかるという問題についてお話ししました。前回冒頭で述べたように、悪い話の次は良い話です。
良い話:別の手段その1 REST
XML Webサービスの暗黒面に嫌気がさしている人たちは、何年も前からいました。そして、彼らから提唱されたXML Webサービスの対抗技術ともいえるものがあります。これはREST(REpresentational State Transfer)と呼ばれますが、具体的な技術仕様ではなく、既存技術を使って、もっと軽くシンプルにXML Webサービスと同じことが実現できるじゃないか、という趣旨のものです。
当然、XML Webサービスを推進するマイクロソフトは、対抗技術であるRESTなど認めてはいません。その結果として、VB.NETには、特にRESTをサポートする機能は含まれていません。
しかし、そこで断念するのは気が早いのです。VB.NETからは.NET Frameworkの膨大なクラス・ライブラリを利用することができます。その中には、RESTが前提とするさまざまな既存技術を扱うためのクラスが用意されています。それらのクラスは、Webアプリケーションや、XML Webサービスを実現するためにも必要とされるため、用意されて当たり前なのです。
では、RESTによって、前回のサンプル・コードと同じことを実現してみましょう。メソッドを公開するサーバ・プログラムと、それを呼び出すクライアント・プログラムです。
まずサーバ側です。Webアプリケーションとしてプロジェクトを作成してASP.NETで動作しますが、HTMLなどは使っておらず、いわゆるWebアプリケーションではありません。
Imports System.Xml |
クライアント側は、これが最善か分かりませんが、こんな感じでさらさらっと書いてみました。コンソール・アプリケーションとして書いてあります。
Imports System.IO |
このコードを見ると、XML Webサービスを使った場合と比較して、かなりコード量が増えていることが分かります。これは低レベルの機能を組み合わせて実現しているためです。また、HTTPというプロトコルや、URI(URL)の書式についてある程度知らないとコードが書けないというハードルの高さもあります。明らかに、XML Webサービスと比較して、楽ではない世界といえます。
しかし、メリットがないわけではありません。これを筆者のPCで実行すると、以下のような処理時間となりました。
REST版
|
00:00:48.4906932
|
前回でXML Webサービスを使った版が約1分39秒だったことを考えると、約半分の処理時間で完了していることが分かります。もちろん、別のコンピュータ上の処理を呼び出す機能性を持っていて、かつ、既存のHTTPというプロトコルを使っているので、プロキシを超えて通信することもできます。つまり、プログラムの難度が高くなり、コードが増えることを了承するのであれば、XML Webサービスよりも早い通信手段があるということです。
さて、ここで強調しておきたいことは、VB.NETは必要とあれば、こういうプログラムを即座に組めるだけの汎用性と基礎的なクラス・ライブラリに恵まれているということです。
VB.NETを使えば、XML Webサービスを即座に組めるというのは1つのメリットではありますが、真のVB.NETの価値は、あらかじめベンダ側から用意されたわけではない別の世界(例えばREST)にも、容易に対応できることだと思います。
良い話:別の手段その2 .NETリモート処理
ファイアウォールを越えなくてよければ、もっと高速かつ簡単に通信する方法があります。それは.NET Frameworkのクラス・ライブラリが提供するバイナリ形式の.NETリモート処理(.NET Remoting)です。これは、独自のプロトコルでデータをやりとりすることによって、別コンピュータのメソッドを高速に呼び出すことを可能とするものです。イントラネット内だけで完結するシステムなどでは、これを使うことができるでしょう。
簡単なサンプル・コードを作ってみましたので、以下に掲載します。詳細を理解する必要はありませんので、雰囲気をつかんでください。
まず、別コンピュータから呼び出されるメソッドを含むクラスを、クラス・ライブラリのプロジェクトとして作っておきます。以下のような感じです。
Public Class SampleService |
これを見て分かるとおり、Inherits System.MarshalByRefObjectによってSystem.MarshalByRefObjectクラスを継承しているほかは、ごく普通のクラスです。このようなクラスを作成することは手慣れたVBプログラマならいとも簡単でしょう。
そして、サーバ側のプログラムは以下のような感じです。コンソール・アプリケーションとして作成されています。
Imports System.Runtime.Remoting |
サーバ側のプログラムで行われていることは、外部からの呼び出しを受け付けるクラス(クラス・ライブラリのプロジェクトとして作成したSampleServiceクラスです)を登録したり、TCP/IPのポート番号(ここでは8910番)を指定したりすることです。ポート番号を指定する部分にのみ、少々ネットワークの知識を必要としますが、RESTに比べればわずかなものです。
一方、クライアント側は以下のようになります。コンソール・アプリケーションとして作成されています。
Module Module1 |
Activator.GetObjectメソッドによって、別コンピュータのオブジェクトを取得する部分を除けば、何ら特別なコーディングは行われていないことが分かるでしょう。
そして速度的な効果は絶大です。筆者のPCで実行すると以下のような結果になりました。
.NETリモート処理版
|
00:00:12.8287026
|
XML Webサービスを使った版が約1分39秒、REST版が約48秒だったことを考えると、比較にならない高速性が発揮されていることが分かると思います。
さて、ここで再び強調しておきたいことは、VB.NETから使用できるのは、流行の派手な機能だけではない、ということです。このような実利的な機能も用意され、容易に利用できます。
VB.NETが、汎用性の高さと併せて、そのような機能を持っていることは、多くの技術上の選択肢をプログラマに与えてくれます。
技術上の選択肢が多いことは、いろいろなシステム開発に対応できる可能性を広げるだけでなく、流行の変化が起こっても、VB.NETによって対応し続けられる可能性を高めます。この適応性の高さは、伝統的にBASIC言語の特徴であると思いますが、VBを使い続ける安心感にもつながると思います。
頑張れVBプログラマ、君たちが使うVisual Basic.NETは取り組む価値のある可能性に満ちたプログラム言語だ!
「熱血VBプログラマ応援団」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|
- - PR -