Как идеологически правильно делать 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
281 +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 Апр 2024 в 20:53
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир