Правильное использование экземпляра класса
-
13-09-2019 - |
Вопрос
Я использую Access 2003 VBA для обработки рекурсивных данных для производственных спецификаций.Я создал модуль класса, чтобы позволить моим основным таблицам иметь статическую область видимости.Кажется, это упрощает рекурсию - это освобождает меня от повторного подсчета уровней вниз и вверх по мере прохождения спецификации.Я не открываю один и тот же набор записей избыточно;Вместо этого я много фильтрую.
Начав эту работу, я прочитал о моделировании объектных отношений и решил создать экземпляр не набора записей, а записи.Тогда поля этой записи могли бы быть свойствами.После большой работы и многих ощущений победы, которые в основном были ошибочными, я понял, что этот подход не имеет никаких преимуществ, поскольку Access основан на таблицах.
Модули моего класса по-прежнему помогают, как и раньше.Мой вопрос касается двух альтернативных версий, приведенных ниже.Первый использует два экземпляра (Родительский,Дочерний).Второй использует один из них, а затем использует его повторно.Очевидно, что первый из них находится под влиянием 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 Создать экземпляр класса -> Получить набор записей 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 Набор записей класса эксплойта ( по - прежнему указывает на родительский )
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Создать экземпляр класса -> Получить набор записей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 Набор записей класса фильтра ( Parent_Part_ID ) Набор записей класса эксплойта ( по - прежнему указывает на родительский )
Решение
Похоже, что первое обеспечивает вам большую простоту использования с точки зрения программиста, поскольку можно просто начать с интересующей вас записи и легко внедриться в ассоциированные записи, просто обратившись к свойствам записи, с которой вы начали.
С другой стороны, последнее представляется более эффективным, поскольку оно не пессимистично загружает каждую запись, которая может быть связана с текущей.
Пара потенциальных оптимизаций первого подхода, которые могли бы помочь ему приблизиться к эффективности второго при сохранении простоты использования:
- Загружайте дочерние записи только по мере необходимости.Использование методов доступа Get / Set позволит вам загружать их точно в срок, а не все сразу, когда родительская запись извлекается из базы данных.
- В качестве альтернативы используйте соединение для извлечения всех дочерних данных сразу как часть одного запроса.Это по-прежнему дало бы вам все предварительно загруженные данные, но существенно сократило бы количество запросов, которые вам нужно выполнить, чтобы их получить.
Надеюсь, это хоть как-то поможет.
Другие советы
Рассматривали ли вы возможность использования поставщика msdatashape и синтаксиса SHAPE для создания иерархические наборы записей ADO?