1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

複数のデータをまとめて扱う 〜複数データを扱うデザインパターン〜

Last updated at Posted at 2013-03-20

「配列変数じゃもの足りない。データベースじゃ大げさ。」
そんな場合には、こんな方法で処理しています。

目次
1.配列を使う、今までのの方式
2.ArrayListを配列の代わりとして使う
3.ジェネリッククラスを使う
4.LINQで検索する

1.配列変数を使う、今までの方式

あるデータを複数まとめて扱う場合、配列変数に入れておくことは、よくあることだと思います。
例えば、チームのメンバーを配列変数に入れておく、といったような場合です。
まず、メンバー一人を表現するクラスを作ります。

human.vb
Public Class Human

    ''' <summary>
    ''' 名前
    ''' </summary>
    ''' <remarks>苗字+名前の名前の部分</remarks>
    Private pFirstName As String

    ''' <summary>
    ''' 苗字
    ''' </summary>
    ''' <remarks>苗字+名前の名前の苗字</remarks>
    Private pLastName As String

    ''' <summary>
    ''' 生年月日
    ''' </summary>
    Private pBarthday As Date

    ''' <summary>
    ''' コンストラクタ
    ''' </summary>
    ''' <param name="isFirstName">この人の名前</param>
    ''' <param name="isLastName">この人の苗字</param>
    ''' <param name="idBarthday">この人の生年月日</param>
    Public Sub New(ByVal isFirstName As String, ByVal isLastName As String, ByVal idBarthday As Date)
        pFirstName = isFirstName
        pLastName = isLastName
        pBarthday = idBarthday
    End Sub

    ''' <summary>
    ''' 氏名(苗字+名前)を返す
    ''' </summary>
    ''' <returns>氏名</returns>
    Public Function getFullName() As String
        Return pLastName & pFirstName
    End Function

End Class

こんな感じ。
次に、メンバー達を管理するために、配列変数を作ります。

testcode1.vb
        Dim members(0 To 2) As Human 'あらかじめ大きさを決めておかないといけない
        members(0) = New Human("太郎", "山田", #3/1/1950#)
        members(1) = New Human("花子", "佐藤", #8/31/1970#)
        members(2) = New Human("次郎", "山田", #3/1/2010#)
        'すぐ追加できない。ReDimでサイズを変更しないと。

VB.NET(.NET Framework)の配列は賢いので、C言語のそれと比べれば扱いやすいですが、それでも、要素を追加したり削除するのは面倒です。

ArrayListを配列の代わりとして使う

そこで、ArrayListを使います。

testcode2.vb
        Dim membersArrayList As New ArrayList '大きさを決めておかなくていい!
        membersArrayList.Add(New Human("太郎", "山田", #3/1/1950#))
        membersArrayList.Add(New Human("花子", "佐藤", #8/31/1970#))
        membersArrayList.Add(New Human("次郎", "山田", #3/1/2010#))

        '追加はAddすればいい!
        membersArrayList.Add(New Human("智子", "鈴木", #5/1/1990#))

        'For Each文で、簡単に各要素へアクセス
        For Each oneMember As Human In membersArrayList
            Debug.Print(oneMember.getFullName)
        Next

上記のように、配列のように大きさを気にする必要がなくなる分コーディングが楽になり、本来コーディングしたい内容に集中でき、バグも入り込みにくくなります。

でも、ArrayListってめんどくさい

しかし、ArrayList.Add()は引数にObject型を受け取るので、下記のように、違うものも追加できてしまいます。

testcode3.vb
        '違う型も追加できてしまう!まぜるな危険!
        Dim otherObject As New Object
        membersArrayList.Add(otherObject)

こんな風に混じり物があると、For Eachで回した時、実行時エラーになってしまいます。

取り出すとオブジェクト型になってる

もう1つ厄介なことがあります。ArrayList.Items()で1件のデータを取り出すと、Object型になっているので、キャストしないとHuman型のgetFullName()を呼び出せません。
また、さっきのように「まぜちゃった」ら、キャストしたときに実行時エラーになってしまいます。

3.ジェネリッククラスを使う

4.LINQで検索する

(書き途中ですが、upしちゃいます)

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?