Как идеологически правильно делать Lazy Load и делать ли её вообще? Код на PHP.class Category {
public function getChilds(); // найти дочерние узлы
}
Вариант 1.
Ленивая загрузка в private свойство $childs.
Недостаток - при изменении потомков узла нужен механизм обновления $childs.
Причем этот механизм придется каждый раз писать руками, т.е. каждый раз заново делать в контексте объекта $this->childs = null;
$this->childs = $this->getChilds() ;
в соответствующих методах, что очень не хочется.
Вариант 2.
Не делать lazy load, тогда во View я не могу делать что-то типа getChilds() && $category->getChilds()->count()): ?>
getChilds() as $child): ?> name?>


- ибо будет каждый раз запрос к СУБД.
М.б. есть какие-то шаблоны проектирования по этому поводу, какие-то мысли?
Если кто разрабатывал подобные костыли, как вы писали?

22 Фев 2021 в 19:48
202 +1
0
Ответы
1

Один из способов решения этой проблемы - использование шаблона Proxy. Вы можете создать прокси-класс, который будет оборачивать ваш объект Category и выполнять фактическую загрузку дочерних узлов только при обращении к ним. Примерно так:

class CategoryProxy {
private $category;
private $loaded = false;
public function __construct(Category $category) {
$this->category = $category;
}
public function getChilds() {
if (!$this->loaded) {
$this->category->getChilds();
$this->loaded = true;
}
return $this->category->getChilds();
}
}
// Использование
$category = new Category();
$categoryProxy = new CategoryProxy($category);
// При обращении к getChilds() произойдет загрузка только в момент обращения
if ($categoryProxy->getChilds() && $categoryProxy->getChilds()->count()) {
// Ваш код
}

Таким образом, вы избежите лишних запросов к базе данных, и загрузка дочерних узлов будет производиться только при необходимости.

Еще один вариант - использование кэширования. Вы можете кэшировать результат запроса дочерних узлов и проверять кэш перед выполнением запроса к базе данных. Например:

class Category {
private $childsCache = null;
public function getChilds() {
if ($this->childsCache === null) {
$this->childsCache = $this->realGetChilds();
}
return $this->childsCache;
}
private function realGetChilds() {
// Запрос к базе данных
}
}

Эти подходы помогут сделать lazy load более удобным и эффективным в вашем приложении.

17 Апр в 20:53
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 683 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир