Правильное использование экземпляра класса - PullRequest
1 голос
/ 14 июля 2009

Я использую Access 2003 VBA для обработки рекурсивных данных для изготовления спецификаций. Я построил модуль класса, чтобы мои основные таблицы имели статическую область видимости. Кажется, это упрощает рекурсию - это освобождает меня от пересчета уровней вниз и снова, когда я пересекаю спецификацию. Я не открываю тот же набор записей излишне; Вместо этого я много фильтрую.

После этого я прочитал об объектно-реляционном моделировании и решил создать экземпляр не набора записей, а записи. Тогда поля этой записи могут быть свойствами. После большой работы и многих острых ощущений победы, которые были по большей части ошибочными, я понял, что этот подход не имеет преимуществ, потому что Access основан на таблицах.

Мои модули класса все еще помогают, как и раньше. Мой вопрос о двух альтернативных версиях ниже. Первый использует два экземпляра (Parent, Child). Второй использует один, а затем снова использует его. Очевидно, что первый находится под влиянием 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
         <b>Create instance of Class --> Get recordset</b>
         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
    <em>Exploit Class recordset ( still points to parent )</em>
 <hr>    
    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
         <strike>Create instance of Class --> Get recordset</strike>
         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
    <b>Filter Class recordset ( Parent_Part_ID )</b>
    <em>Exploit Class recordset ( still points to parent )</em>

Ответы [ 2 ]

1 голос
/ 10 августа 2009

Рассматривали ли вы использование поставщика msdatashape и синтаксиса SHAPE для создания иерархических наборов записей ADO ?

1 голос
/ 15 июля 2009

Кажется, что первое дает вам больше простоты использования с точки зрения программиста, так как вы можете просто начать с интересующей вас записи и легко внедриться в связанные записи, просто используя свойства записи, с которой вы начали. 1001 *

С другой стороны, последняя может показаться более эффективной, так как пессимистично не загружает каждую запись, которая может быть связана с текущей.

Пара потенциальных оптимизаций для первого подхода, которые могут помочь ему приблизиться к эффективности второго при сохранении простоты использования:

  • Загружайте дочерние записи только по мере необходимости. Использование методов доступа Get / Set позволит вам загружать их точно в срок, а не все сразу, когда родительская запись извлекается из БД.
  • В качестве альтернативы используйте JOIN для извлечения всех дочерних данных одновременно как часть одного запроса. Это все равно даст вам все предварительно загруженные данные, но уменьшит количество запросов, которые вы должны выполнить, чтобы получить их существенно.

Надеюсь, это поможет.

...