最佳程序实践:字典或同步数组

本文关键字:同步 数组 字典 程序 最佳 | 更新日期: 2023-09-27 18:00:51

我想知道什么是最好的,或者是否有更多的可能性。我正在从数据库中检索数据,例如,我需要存储IDS和NAMES。最好将它们存储在索引"同步"的不同阵列上,例如(Vb.net):

Dim ids As New List(Of Integer)()
Dim sCods As New List(Of String)()
For each elem In dataBaseData
    ids.Add(CInt(elem("id")))
    sCods.Add(elem("cod").ToString())
Next

所以我知道第三个位置的索引上的id对应于另一个数组上的相同索引。或者最好这样做:

Dim sCods As New Dictionary(Of Integer, String)()
For each elem In dataBaseData
    sCods.Add(CInt(elem("id")), elem("cod").ToString())
Next

现在假设我也必须存储子元素。我的意思是,对于每个id,都有一个元素列表,因此字典将类似于:

Dim sSubs As New Dictionary(Of Integer, List(Of String))()

只有阵列:

Dim sSubs() As New List(Of String)()
Dim sOneSub As String = sSubs(idIndex)(subIndex)

然后想象有很多数据需要检索。我把我的例子放在Vb.Net上,但只有一些例子。

最佳程序实践:字典或同步数组

如您所述,将数据存储在单独的"同步数组"中肯定是不好的做法。这是一个坏主意的原因有很多:

  • 它不是自文档化的-代码的结构没有任何明显的迹象表明,一个数组中的项3存储了与另一个数组的项3相同的对象的数据。因此,让这一点显而易见的唯一方法是在代码中添加注释,解释数据存储的方式和原因。虽然评论绝对是一件好事,但不需要评论就更好了。

  • 您无法轻松引用数据-您打算如何从数据访问层返回这些数据?您打算如何将它作为参数传递给业务层方法?要获取所有数据,您必须传递所有列表。要从列表中传递单个对象的数据,必须将所有数据作为单独的变量传递。

  • 它不灵活-如果以这种方式存储它,则很难向对象添加新属性。例如,现在,您可能只需要存储每个对象的ID和描述,但当您还需要存储日期时会发生什么?您不仅需要添加一个新的列表/数组来存储所有加载对象的日期,还必须修复使用和传递数据的所有地方。如何在代码中找到需要修复的所有位置?这也不容易做到,因为没有可以搜索的对象的特定数据类型。

  • 它很脆弱-由于前面提到的所有原因,以及其他原因,存储这样的数据会导致错误代码。如果列表不同步会发生什么?如果在对象的中途未能加载数据,因此只有部分列表得到更新,会发生什么情况?如果您需要从列表中删除一个项目,但由于某种原因,该项目仅在其中一个列表中失败,该怎么办?如果多个线程需要同时修改数据,该怎么办?如果你不格外小心,事情很容易出错。没有必要让代码变得如此脆弱,那么为什么要给自己带来不必要的麻烦呢?

那么,什么是更好的解决方案呢?嗯,Dictionary肯定是一个更好的选择,但在这种情况下,它可能仍然被误导了。如果只需要为每个对象存储两个数据元素,则不需要字典。字典的目的是存储键/值对,您需要能够快速访问给定键的值。字典使用哈希表对列表进行索引,以使关键字查找非常快速。但如果使用不当,它实际上会降低效率(即,由于生成哈希代码,内存更多,速度较慢)。

存储对象或实体数据的正确方法是创建一个类,这在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类名,然后从上下文菜单中选择查找所有引用选项。

正如其他人所提到的,有一些框架可用于创建实体类并将它们读写到数据库中。我想说,在我写这篇文章的时候,实体框架和NHibernate是两个最受欢迎的选项。它们当然值得考虑,但在开始使用框架之前,充分了解框架在做什么以及为什么需要它总是很重要的。所以,我建议在你开始寻找偷工减料的方法之前,至少试着自己做一段时间的数据访问层。使用让你的生活更轻松的框架并没有错,但如果你错误地或出于错误的原因使用任何框架,它们可能会让你的日子变得更艰难,而不是更轻松。