Как частично инициализировать объекты c ++, когда мне не нужны все значения из базы данных? - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь сократить количество сетевых запросов в моей программе на C ++ (для увеличения скорости), и при отображении результатов поиска я не хочу, чтобы каждый (иногда из тысяч) объектов, найденных в поиске чтобы полностью инициализировать себя из базы данных, когда мне нужно отобразить только часть этой информации.

Намного быстрее выполнить один более крупный запрос, в котором я получаю всю информацию, которую хочу отобразить об объектах сразу в запросе (например, для каждого объекта / строки я выбираю идентификатор, имя и расположение), передавая их большему конструктору и позволяя всем остальным членам быть значениями по умолчанию. Раньше и в других случаях, когда мне нужен был весь объект, я просто передаю идентификатор объекту, а затем вызываю initializeFromDatabase () напрямую, чтобы установить все остальные значения.

//current solution (problem is, I might need many constructors like this for different purposes)
auto *myobject = new MyObject(345, "ObjectName", "Europe");
//no further (costly) initialization since I only need the following 2 values for my search results.
myobject->getName();
myobject->getLocationName();

//prevous solution (resulting in too many queries)
auto *myobject = new MyObject(345);
myobject->initializeFromDatabase();
myobject->getName();
myobject->getLocationName();
//I could also query the other 30 or so members here, everything is set.

Это не похоже на хорошая практика, мне понадобятся другие настраиваемые конструкторы, например, другое окно поиска, отображающее другие виды данных об объектах. Должен ли я создать «объект поиска», который является его собственным классом и который затем может быть использован для создания полного объекта при необходимости? Или всегда инициализировать только с идентификатором базы данных (установив флаг, что объект еще не инициализирован) и использовать нужные мне сеттеры?

1 Ответ

0 голосов
/ 19 июня 2020

Я обнаружил, что решением этой проблемы было бы использование некоторого вида отложенной загрузки, поскольку я хочу быстро загрузить часть объекта для списка, а затем загрузить все это, если пользователь щелкает по одному из объектов. Например, подойдет виртуальный прокси или шаблон Ghost Design. Я просто создаю прокси-объект для отображения результатов поиска (и для других списков в программе), который может создать полный объект по запросу. У каждого прокси-объекта есть один конструктор, поэтому я избегаю проблемы использования множества разных конструкторов для разных целей.

См. Главу 11 «Шаблоны архитектуры корпоративных приложений» Мартина Фаулера (опубликовано издательством Addison-Wesley Professional, 2002)

...