Классы с базовыми данными, а затем еще и больше данных - загрузка частично? - PullRequest
3 голосов
/ 11 ноября 2011

Я действительно понятия не имею, что озаглавить, так что кто-то ПОЖАЛУЙСТА, не стесняйтесь редактировать, как только вы получите мой дрейф ...

Для моего примера у нас есть user и book классы.

Каждый пользователь - одна строка в нашей таблице user_data, каждая книга - одна строка в нашей таблице book_data, и коллекцию каждого пользователя можно запросить из таблицы user_book_collection один-ко-многим.

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

Но я хочу, чтобы все это было доступно в случае необходимости ...

RELATIONSHIP MAP

User
  |-- name
  |-- age
  |-- location
  |-- book collection (ARRAY)
        |-- Great Gatsby
        |-- Grapes of Wrath
        |-- Catch-22
        |-- Huckleberry Finn
              |-- author
              |-- edition
              |-- publisher
              |-- price

Мой текущий подход заключается в загрузке первого «уровня» данных через конструктор пользователя. И потом, если мне нужно что-то узнать его коллекцию, у меня есть пара методов, подобная этой:

public function getBookCollection() {
    if (empty($this->_Books)) {
        self::loadBookCollection();
    }
    return $this->_Books;
}

private function loadBookCollection() {
    // query dbase with user's ID
    // load results into $this->_Books array
}

Проверка empty() состоит в том, чтобы избежать повторных обращений в базу данных для получения данных для массива $_Books различными методами в классе.

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

Это простой пример, но я думаю, что он достаточно ясен.

Мои вопросы:

1) это нормальный способ обработки таких вещей? Я могу представить себе ситуации, когда такого рода перекрытия данных могут просто продолжаться и продолжаться и продолжаться ...

2) есть ли лучший способ?

Спасибо, а кто-нибудь, пожалуйста, возьмите трещину в моем названии!

1 Ответ

1 голос
/ 11 ноября 2011

То, что вы делаете, обычно называется «Ленивая загрузка» или «Ленивая инициализация» и является широко используемым программным дизайном, который помогает повысить производительность, задерживая загрузку данных до тех пор, пока ваша программа в этом не нуждается (если это вообще так). Так что да, вы делаете это в здравом уме;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...