Trainocate Japan, Ltd.

Win Win Windows
ホーム > Win Win Windows > .NET Framework ; システム開発 > 第49回 [開発スキル再始動特集2] プログラムコードを洗練させよう ~配列からコレクション、そしてジェネリック~

Win Win Windowsコラム
第49回 [開発スキル再始動特集2] プログラムコードを洗練させよう ~配列からコレクション、そしてジェネリック~
執筆:大貫 淳子

前回の記事から引き続き、Visual Basic (以下VB)のお話です。

プログラムの外部インターフェイスを変更せずにコードを洗練させることを「リファクタリング」と言います。私は、良いプログラムコードとは、書きやすいコードであり、読みやすいコードであり、そして、保守のしやすいコードであるのがベストだと思います。
メンテナンスのしやすいコードは作った人だけでなく、その後にシステムに携わる人も幸せになります。プログラムは、そのコードを書いた人よりも、その後に運用していく人のほうが多く読む場合も多々ありますから、書きっぱなしではなく、ひと手間かけるとより素敵になるわけです。

今回は、この「コードを洗練させる」時に役立つかもしれないトピックについてご紹介します。

■配列で複数データを格納する

VB にも他の言語同様 「配列」という機能があります。1つの変数名で複数のデータを保存できます。

文字列型の配列を定義
Dim myArray() As String

再定義する場合は Redim、
元の値を保持しつつ、配列のサイズを拡張する場合は、ReDim Preserve というキーワードを使います。

1件目(インデックス0)へAAA、2件目(インデックス1)へBBBを代入
ReDim myArray(0) = "AAA"
ReDim Preserve myArray(1) = "BBB"


複数のデータを増やすときはループなどを用いながらReDim Preserveで追加できます。これはとても便利で、VBならではのキーワードです。C# には用意されていません。

ですが、この記述では、データの追加は末尾にしかできません。

■コレクションを使おう

そこで、配列を「コレクション(Collection)」という機能に置き換えてみます。コレクションはVB6からも使えていました。(が、私は知らずに配列をずっと使っていました)。今回は.NET FrameworkのSystem.Collections という名前空間の ArrayList クラスを使用します。

文字列型のコレクションを定義
Dim myCollection As New System.Collections.ArrayList

データの追加はAddというメソッドで利用可能です。

1件目(インデックス0)へAAA、2件目(インデックス1)へBBBを代入
myCollection.Add("AAA")
myCollection.Add("BBB")


コレクションでは、途中の要素追加が簡単にできる Insert というメソッドも用意されています。

インデックス 0 に 要素「XXX」を挿入し、既存の 2 件がスライドします。

myCollection.Insert(0, "XXX")

同様に途中の要素削除も簡単にできます。
メモリの使用も効率化されており、特に何度もデータを追加する場合には処理速度に差が出ます。私のPCでは5万件のデータの追加で1秒以上の差が出ました。(マシンスペックやメモリ容量で変わります)


■ジェネリックコレクションでさらに進化

ただ、このArrayListは、配列のように格納できるデータの型に制限がかけられないため、文字型や数値型や日付型などの異なるデータ型の値を格納することができます。これはこれで便利な場合もあるのですが、取り出す際に、必ずデータ型を調べて然るべきデータ型に変換しなければなりません。データ型を間違って変換してしまうと、実行時エラーである例外が発生します。
コレクションに格納されるデータ型が一種類で予め決まっているのであれば、データ型を宣言し間違った型のデータ格納をコンパイル エラーとして実行前に検出できた方が安全です。またコレクションからデータを取得する時にデータ型の変換が不要になります。
このような型の安全性と、コレクションの柔軟な使い勝手を両立するために、.NET Framework 2.0 からは 「ジェネリック コレクション」 という機能が追加されました。

前述の ArrayList を ジェネリック コレクションの List(of T) というクラスで置き換えてみます。

Dim myCollection As New System.Collections.Generic.List(Of String) myCollection.Add("AAA")
myCollection.Add("BBB")



ジェネリック コレクション定義時に文字列型(Of String)と指定しておくと、文字以外のデータは格納できません。コンパイル時にコンパイル エラーが発生します。

なお、2次元配列など、配列のほうが使いやすいと思われる場合もありますので、適材適所で使い分けてください。

既存のプログラム、正常に動作しているプログラムに手を入れるのは勇気のいることですが、プログラム言語仕様はバージョンアップし続けています。新しいキーワードや文法が登場するのにはそれなりの理由があり背景があるはずですから、それを取り入れることによって改善することも多くあります。リファクタリングによってメンテナンスがしやすくなったり、機能アップするメリットもあります。
プログラムを変更するとテストも必要になりますね。効率の良いテスト手法が導入されていれば、リファクタリングも気軽に取り組めるはずです。このテスト手法も進化しています。これはまた別の記事で紹介します。

その他、システム開発系の情報は「Visual Studioによるアプリケーション開発とライフサイクル管理(ALM) 」でご紹介しています。ぜひご覧ください。

[.NET Frameworkシステム開発][2014年9月 9日配信]

 

※Microsoft、Windowsは、米国Microsoft社の登録商標です。
※Oracleは、米国オラクル・コーポレーションおよびその子会社、関連会社の米国およびその他の国における登録商標です。
※PMI、PMP、PMBOKは、プロジェクトマネジメント協会(Project Management Institute, Inc.)の登録商標です。
※ITIL®はAXELOS Limited の登録商標です。
※American Management Association は、米国アメリカン マネジメント アソシエーションの登録商標です。
※BOOT CAMP、NEW TRAIN、Glovalueはトレノケート株式会社の登録商標です。
※その他このサイトに掲載された社名、製品名は、各社の商標、または登録商標です。

© Trainocate Japan, Ltd. 2008-2017, All Rights Reserved.
  • Get ADOBE READER