代码之家  ›  专栏  ›  技术社区  ›  Smandoli

类实例的正确使用

  •  1
  • Smandoli  · 技术社区  · 15 年前

    我正在使用Access2003 VBA处理生产物料清单的递归数据。我构建了一个类模块,让主表具有静态范围。这似乎简化了递归——当我遍历一个BOM时,它使我可以自由地向下和向上计数级别。我不是重复打开同一个记录集,而是过滤了很多内容。

    在进行了这项工作之后,我阅读了关于对象关系建模的内容,并决定不引用记录集,而是引用一个记录。那么该记录的字段可以是属性。经过大量的工作和许多大错特错的胜利的激动之后,我意识到这种方法没有任何好处,因为访问是基于表的。

    我的课程模块仍然像以前一样有用。我的问题是关于下面两个备选版本。第一个实例使用两个实例(父实例、子实例)。第二个使用一个,然后重用它。显然,第一个是ORM影响。

    有没有理由选择其中一个而不是另一个?另外,请注意末尾的斜体字:如果我不需要它(因为我不需要关于父级的更多信息),这会改变答案吗?有人能帮我全面思考吗?

    (注意,我关闭记录集,但不关闭类实例。我的理解是,VBA实例关闭自己,让它们这样做是公认的实践。我似乎把伪代码带到了伪代码的新层次…目标是清晰,希望能奏效。)

        VERSION 1 
        Property Sub ReviewPart ( Parent_Part_ID )
    
        Get Parent_Part_ID
        Create instance of Class --> Get recordset
        Filter Class recordset ( Parent_Part_ID )
        Exploit Class recordset
        See if Parent_Part_ID has Childs
        If it does:
           Open recordset of Childs
           For each Child
             Get Child_Part_ID
             Create instance of Class --> Get recordset
             Filter Class recordset ( Child_Part_ID )
             Exploit Class recordset
             See if Child_Part_ID has Childs
             If it does:  
               Instance New ReviewPart ( Child_Part_ID )
             Otherwise:
             Nothing; Move On
           Next Child
           Close recordset of Childs
        Otherwise:
           Move On
        Exploit Class recordset ( still points to parent )
     
    VERSION 2 Property Sub ReviewPart ( Parent_Part_ID ) Get Parent_Part_ID Create instance of Class --> Get recordset Filter Class recordset ( Parent_Part_ID ) Exploit Class recordset See if Parent_Part_ID has Childs If it does: Open recordset of Childs For each Child Get Child_Part_ID Create instance of Class --> Get recordset Filter Class recordset ( Child_Part_ID ) Exploit Class recordset See if Child_Part_ID has Childs If it does: Instance New ReviewPart ( Child_Part_ID ) Otherwise: Nothing; Move On Next Child Close recordset of Childs Otherwise: Move On Filter Class recordset ( Parent_Part_ID ) Exploit Class recordset ( still points to parent )
    2 回复  |  直到 15 年前
        1
  •  1
  •   Sean McMains    15 年前

    从程序员的角度来看,前者似乎给了您更好的易用性,因为您可以简单地从您感兴趣的记录开始,并且只需访问您开始使用的记录的属性就可以轻松地根目录到关联的记录中。

    另一方面,后者似乎更有效率,因为它不会悲观地加载可能与当前记录相关的每个记录。

    对第一种方法的一些潜在优化可能有助于它在保持易用性的同时达到第二种方法的效率:

    • 只在需要时加载子记录。使用get/set访问器将允许您及时加载这些访问器,而不是在从数据库中提取父记录时立即加载所有访问器。
    • 或者,使用联接作为单个查询的一部分,一次检索所有子数据。这仍然会给您预加载的所有数据,但会减少您必须运行的查询的数量,从而获得大量的数据。

    希望能有所帮助。

        2
  •  1
  •   onedaywhen    15 年前

    是否考虑使用msdatashape提供程序和形状语法生成 hierarchical ADO recordsets ?

    推荐文章