あなたが説明したように、データを別々の「同期された配列」に保存することは間違いなく悪い習慣です。それが悪い考えになる理由はたくさんあります。
自己文書化ではありません-ある配列の項目3が別の配列の項目3と同じオブジェクトに関するデータを格納することを意味するコードの構造については明らかなことは何もありません。したがって、それを明確にする唯一の方法は、データが保存される方法と理由を説明するコメントをコードに追加することです。コメントは間違いなく良いことですが、コメントを必要としないことはさらに良いことです。
データを簡単に参照することはできません-データアクセス層からこのデータをどのように返すつもりですか?それをパラメータとしてビジネスレイヤーメソッドにどのように渡すつもりですか?すべてのデータを取得するには、すべてのリストを渡す必要があります。リストから単一のオブジェクトのデータを渡すには、すべてのデータを個別の変数として渡す必要があります。
柔軟性がありません-そのように保存すると、オブジェクトに新しいプロパティを追加することが非常に困難になります。たとえば、現時点では、各オブジェクトのIDと説明のみを保存する必要があるかもしれませんが、日付も保存する必要がある場合はどうなりますか?ロードされたすべてのオブジェクトの日付を格納するために新しいリスト/配列を追加する必要があるだけでなく、データを使用して渡すすべての場所を修正する必要があります。そして、修正する必要のあるコード内のすべての場所をどのように見つけますか?検索できるオブジェクトの特定のデータ型がないため、これも簡単ではありません。
それはもろいです-すでに述べたすべての理由、およびそれ以上の理由で、そのようなデータを保存すると、バグのあるコードにつながります。リストが同期しなくなった場合はどうなりますか?オブジェクトの途中でデータをロードできず、一部のリストのみが更新された場合はどうなりますか?リストからアイテムを削除する必要があり、それが何らかの理由でリストの1つだけで失敗した場合はどうなりますか?複数のスレッドが同時にデータを変更する必要がある場合はどうなりますか?非常に注意しないと、事態は非常に簡単に失敗する可能性があります。コードをそれほどもろくする必要はないのに、なぜ不必要に面倒なことをすべて自分自身に与えるのでしょうか。
では、より良い解決策は何ですか?まあ、それDictionary
は間違いなくより良いオプションですが、この場合、それはまだ誤った方向に進んでいる可能性があります。オブジェクトごとに2つのデータ要素を格納するだけの場合は、辞書は必要ありません。ディクショナリの目的は、キーを指定して値にすばやくアクセスできるようにする必要があるキーと値のペアを格納することです。ディクショナリはハッシュテーブルを使用してリストにインデックスを付け、キーの検索を非常に高速にします。ただし、適切に使用しないと、実際には効率が低下する可能性があります(つまり、メモリが増え、ハッシュコード生成のために遅くなります)。
DB設計で呼ばれることもある、オブジェクトまたはエンティティのデータを格納する正しい方法は、クラスを作成することです。これらのクラスは、多くの場合、データ転送オブジェクト(DTO)クラスと呼ばれます。例えば:
Public Class MyEntity
Public Property Id As Integer
Public Property Code As String
End Class
次に、たとえば次のように、必要な任意のタイプのリストにデータを簡単に保存できます。
Dim entityArray() As MyEntity ' Arrays are great for storing lists which don't change in length very often
Dim entityList As List(Of MyEntity) ' Lists are great when the number of items in the list keeps changing
Dim entityDictionary As List(Of Integer, MyEntity) ' Dictionaries are great when you need to quickly access items by their key (their ID, in this case)
Dim entityQueue As Queue(Of MyEntity) ' Queues are great when you need to process incoming items in the order that they were received
' Etc.
MyEntity
これで、オブジェクトを返す必要があるときに、それを返すことができますAs MyEntity
。そして、それらのリストを返す必要がある場合は、それらを単一のリストとして返すことができます。それらをパラメータとしてメソッドに渡す場合も同様です。
また、エンティティに新しいプロパティを追加する必要がある場合は、次のようにDTOクラスに追加するだけです。
Public Class MyEntity
Public Property Id As Integer
Public Property Code As String
Public LastModified As Date ' Hey look! A new field.
End Class
これで、そのデータ型で機能するすべてのコードが、その新しいプロパティに即座にアクセスできるようになります。あなたがしなければならないのは、フィールドにデータを入力することだけです。そのデータ型で機能するコード内のすべての場所を検索する場合は、MyEntity
クラス名を右クリックして、コンテキストメニューから[すべての参照を検索]オプションを選択します。
他の人が述べているように、エンティティクラスを作成し、それらをデータベースに読み書きするために利用できるフレームワークがあります。これを書いている時点では、EntityFrameworkとNHibernateの2つが最も人気のあるオプションだと思います。それらは確かに検討する価値がありますが、フレームワークを使い始める前に、フレームワークが何をしているのか、なぜそれが必要なのかを完全に理解することが常に重要です。したがって、手抜きをする方法を検討する前に、少なくともしばらくの間、データアクセスレイヤーを適切に実行することをお勧めします。生活を楽にするフレームワークを使用することに何の問題もありませんが、フレームワークを誤って、または間違った理由で使用すると、生活がより困難になり、簡単ではなくなる可能性があります。