Visual Basic 2005 ここが便利!IDE編

第7回 どう書くんだっけ? を「コード・スニペット」で一発挿入!

株式会社ピーデー 川俣 晶
2005/08/17

Visual Studio 2005や.NET Framework 2.0の登場とともに、プログラミング言語であるVisual Basic .NETも「Visual Basic 2005」へとバージョン・アップする。この新しいVisual Basicには、言語仕様の面でも統合開発環境の面でも、プログラミングを楽にする新機能が満載だ。本連載ではその中でも特に注目すべき便利な機能を1つずつピックアップしながら紹介していく。

繰り返し使われるパターン化されたコードの存在

Back Issue
1
“My”はクラスの海からVBプログラマを救う!?
2 型指定されたコレクションを実現するジェネリック
3 自動生成コードを分離、ソースをすっきりパーシャル・クラス
4 Background Workerで夢のマルチスレッドがついに!
5 Usingステートメントで簡単、確実にファイルをクローズ
6 演算子のオーバーロードで独自の型も‘+’で足し算!

 プログラムを書いていると、「あれ、また同じことを書いているぞ」と思うことがある。同じコードを何回も繰り返すことは明らかに無駄なので、偉大な先人は「サブルーチン」というものを発明した。同じプログラム内に、同じコードが複数あれば、それを1つにまとめ、それを呼び出すようにすれば無駄は減る。

 しかし、別のプログラムに同じコードがある場合に、このテクニックは使えない。そこで、偉大な先人は「ライブラリ」というものを発明した。複数のプログラムで繰り返しよく使われるコードは、個々のプログラムのソース・コードとは別にまとめておき、各プログラムはそれを参照すればよい。これで、また無駄は減った。

 しかし、まだ完ぺきではない。コードの基本的な枠組みは共通しているが、内容は同じではないというパターンもあるのだ。このようなケースでは、コードをライブラリにする方法はなじまない。共通しているのは枠組みだけであって、具体的なコードは共通ではないからだ。そこで、これに対処するために「デザインパターン」が生まれた。

 さて、これですべての死角がカバーされ、もう無駄なことはなくなったのかというと、そうではない。まだカバーされていない微妙な領域が残されているのだ。プログラム言語そのものが直接提供してくれるわけではないものの、ライブラリやデザインパターンとして扱うほどでもないシンプルな領域である。つまり、プログラム言語の持つ機能や、ライブラリが提供する機能を1つ、あるいはいくつか組み合わせるだけで実現できるものである。

 これらは、言語仕様やライブラリを拡張するまでもない機能なのだが、何せ組み合わせが膨大であるため、どのように書けば実現できるかがとっさに分からないことも多い。もちろん、このような領域にも、繰り返し使われるパターン化されたコードが存在するわけで、「あれ、また同じことを書いているぞ」と思うことも珍しくない。

 従来はこれに対処する有効な手段がなかった。強いていえば、コーディングの定石集としてまとめておくか、検索機能を頼りに運よく行き当たることを期待して探すか、あるいは「教えて君」と化して技術系メーリングリストで安易に質問しひんしゅくを買うかなどなどの方法しかなかった。

 しかし、Visual Basic 2005で状況は変わった。Visual Basic 2005で新しく追加された「コード・スニペット」という機能が、この問題を解決してくれる。

コード・スニペットとは何か?

 コード・スニペットとは、よく使われる短いコードの断片に分かりやすい名前を付け、簡単な操作でソース・コードに挿入可能にしたものである。つまり、やりたいことを表現している名前を持つコード・スニペットを選ぶと、それを実現するコードがソース・コードに挿入されるわけである。

 では具体的にVisual Basic 2005 Express Beta 2で、コード・スニペットを体験してみよう。

 題材としては、Webサーバからファイルをダウンロードする機能を選んでみた。この機能は、.NET Frameworkのクラス・ライブラリを使えばいともあっさりと実現できるのだが、普段からそのようなプログラミングに慣れ親しんでいないと、どのようなクラスをどのように使えばよいか皆目見当も付かないだろう。簡単なのに難しい、という事例である。

 まずは、以下のようなフォームを作ってみよう。テキストボックスが2つ(URL入力用と、保存するファイル名の入力用)と、ボタンを1つ貼り付けておこう。あとは自由に格好よくデザインしてみよう。

Visual Basic 2005で作成したWindowsフォーム
2つのテキストボックスと1つのボタンを配置している。

 さて、次にボタンを押したときに、テキストボックスに入力されたURLから、ファイルをダウンロードして保存するコードを追加しよう。まず、ボタンをダブルクリックしてイベント・ハンドラを追加する。その後は、難しいことを考える必要はない。コード・スニペットの出番である。

 イベント・ハンドラ内の空行部分を右クリックすると、コンテキスト・メニューが表示される。その中に、[スニペットの挿入]という項目があるので、それを選ぶ。

スニペットの挿入開始
スニペットを挿入したい部分を右クリックして[スニペットの挿入]を実行する。

 すると、コード上に「スニペットの挿入」という文字が表示され、大項目のリストが表示される。

スニペットとして登録されている大項目のリスト
コード・スニペットは、探しやすいように階層構造に分類されている。欲しいコードはネットワークに関係するものなので、ここでは一番上の[Connectivity and Networking]を選択する。

 コード・スニペットは、探しやすいように階層構造に分類されている。コード・スニペットを自作することも容易で、その場合には新しい項目を増やすこともできる。さて、ここで扱いたいのはWebサーバからのファイルのダウンロードなので、ネットワーク関係だと推理できる。そこで、一番上の[Connectivity and Networking]をダブルクリックしてみよう。

 すると、[Connectivity and Networking]の項目に属するスニペットのリストが表示される。

[Connectivity and Networking]の項目に属するスニペットのリスト
Webサーバからのファイルのダウンロードを実現してくれそうな[Download a File using Http]というスニペットを選択する。

 ここでは、[Download a File using Http]というスニペットが、Webサーバからのファイルのダウンロードを実現してくれそうなので、これを選んでみよう。

コード・スニペットにより挿入されたコード(赤枠内)
挿入されたコードには、バイト配列(Byte())へのダウンロードと、ファイルへのダウンロードの2種類のコードが含まれている。また、クラスの利用に必要な名前空間の参照を行う「Imports System.Net」も自動挿入されている。

 すると、かなり多くのコードが自動的に挿入される。これらのコードは、すべて必要とされているわけではない。コメントに書かれているとおり、ここで挿入されたコードには、バイト配列(Byte())へのダウンロードと、ファイルへのダウンロードの2種類のコードが含まれている。ここで使いたいのは、後者だけなので、前者のコードはこの後行うパラメータの書き換えが終わった後で削除する必要がある。

 また、見落としがちであるが、先頭行部分にも「Imports System.Net」という宣言が追加されている。つまり、スニペットの挿入とは、単に数行のコードを挿入するだけの機能ではなく、コード全体の整合性も保つようになっている。

 しかし、挿入されたコードはそのままでは使えない。見て分かるとおり、DownloadFileメソッドのパラメータには、システム側で勝手なURLと勝手なファイル名が挿入されてしまっている。これは書き直さねばならない。しかし、その書き換えも手軽に行うことができるような支援機能が用意されている。

 挿入されたコードで書き換えが必要とされる個所は、あらかじめ薄緑色の背景で示されており、[TAB]キーを押すことで、その場所に直接飛んでいき、即座に書き換えができるようになっている。ここでは、DownloadFileメソッドのパラメータを書き換えるので、[TAB]キーを2回押し、DownloadFileメソッドの第1パラメータを選択する。そして、「TextBoxURL.Text」とタイプすれば、望みのパラメータへ入れ替え完了である。

挿入されたスニペットにおけるパラメータの書き換え
背景が薄緑色で表示されている部分は書き換える必要がある個所であり、[TAB]キーを押すことによりその場所に簡単に移動することができる。

 この後、もう1回[TAB]キーを押して、DownloadFileメソッドの第2パラメータも書き換える。そして、不要な行をすべて削除してしまおう。これで以下のようにシンプルで引き締まったコードが残る。

修正が完了して出来上がったイベント・ハンドラ
薄緑色で表示されていたパラメータ部分をすべて書き換え、不要な行を削除すれば完成である。

 では[F5]キーを押して実行し、URLとファイル名を入力したら、[Download]ボタンをクリックしてみよう。

作成したWindowsアプリケーションの実行画面
[Download]ボタンをクリックすれば、指定したURLのページが指定したファイル名でハードディスクに保存される。

 指定内容に誤りがなければ、Webサーバから取得したファイルがディスクに保存されているはずだ。

 このように目的のコードは完成した。ここで、以上の過程においてWebサーバよりファイルをダウンロードする機能はどのクラスにあるのだろうか、ということを考える必要がなかったことに注目してほしい。そう、私たちは、あくまで必要とされる機能を手掛かりに、名前からスニペットを選択しただけなのだ。膨大なクラス・ライブラリの海でおぼれることなく目的を達成できるのは、とても好ましい特徴といえる。つまり、とても楽ができるということである。

マニアックで面白いスニペットもある

 あらかじめ用意されているスニペットの中には、「これぐらい誰でも分かるだろう」というようなものから、マニアックなものまで、さまざまなものが含まれている。

 中でも筆者が個人的に気に入ったのは、[Interacting with the Application]に含まれる[Capture output from Console Application]である。これを使うと、子プロセスとして起動したコンソール・アプリケーションの標準出力を、容易にGUIアプリケーションに取り込むことができる。最近、ネットワーク管理者などを中心に、コンソール・アプリケーションとして作られた管理ツールを活用する事例などが増えているが、そのツールなどが出力する情報を、容易に取り出せるということである。

 以下はこのスニペットを使って、Windows NT系OSでIPアドレスの設定を行うツール「ipconfig.exe」の出力をウィンドウ内に出力させた例である。ちなみに、コードの大半はスニペットの挿入で実現されたものである。自分で書いたのは、背景が薄緑色の「ipconfig.exe」というファイル名と、TextBoxコントロール(TextBoxMain)を操作する2行のコードだけである。もちろん、事前に複数行入力可能な(=MultilineプロパティをTrueに設定した)TextBoxコントロールを1つフォームに貼り付けておき、名前を「TextBoxMain」に変えておく必要がある。

子プロセスとして起動したアプリケーションの標準出力を取り込むスニペット(赤枠内)
これらのコードは、[スニペットの挿入]−[Interacting with the Application]−[Capture output from Console Application]を実行すれば追加される。この場合には、子プロセスとして起動するコマンド名の部分(修正が必要な個所)が薄緑色で表示されている。

 これを実行すると以下のようになる。

上記アプリケーションの実行画面
子プロセスとして実行された「ipconfig.exe」の出力文字列を取り込み、テキストボックスに表示している。ipconfig.exeは、パラメータなしで実行されると、現在のIPアドレス設定を表示する。

 もちろん、取り込んだ結果は単なる文字列なので、テキストボックスに入れずに必要な情報だけを抜き出して活用するプログラムを作成することも容易である。End of Article

 
インデックス・ページヘ  「Visual Basic 2005 ここが便利!」


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