Реализация класса PHP с эффективным использованием памяти в PHP - PullRequest
2 голосов
/ 15 октября 2011

Я создаю класс, который реализует составной шаблон; Предполагается, что класс может представлять дерево (поэтому назовем его Tree).

Чтобы использовать как можно меньше памяти, когда экземпляру класса Tree передается массив, он сохраняется как массив до тех пор, пока не потребуется индекс; в это время новый дочерний экземпляр дерева создается и возвращается

Причина этого: экземпляры My Tree проходят через множество фильтров, и их наблюдатели могут просматривать и изменять их содержимое, но их содержимое будет запрошено только один раз (при окончательном рендеринге). Более того, определенный фрагмент может вообще не отображаться, поэтому будет потрачена впустую память на создание экземпляров Tree, которые даже не будут использоваться.

Другими словами, если использовать

$class->set($array,$index); //(or $class[$index] = $array)

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

$class->get($index) //(or $class[$index])

, будет возвращен новый экземпляр Tree (и кэширован для последующих вызовов).

Однако у меня осталась дилемма: я

  1. создать новый экземпляр дерева, когда кто-то устанавливает данные?
    • Плюсы: код прост в написании, прост в обслуживании, прост в подборе и совершенствовании
    • Минусы: потребление памяти, даже больше, если учесть, что часть введенных данных может не использоваться. Манипуляция становится более запутанной, поскольку для особых случаев должны быть написаны специальные методы (в отличие от работы с нативными массивами).
  2. оставить все как есть, но люди делают $ class [$ index] = array ($ index2 => $ array)?
    • Плюсы: все хранится в виде массива, поэтому работают обычные функции массива и потребление памяти минимален.
    • минусов: использование менее "элегантно" и, возможно, более сложно.

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

1 Ответ

1 голос
/ 15 октября 2011

Демо создание Дерева по конструкции и Демо создание Дерева по требованию - это простые тесты, которые вы можете запустить для себя.

Последний создает новые объекты узлов только тогда, когда к ним обращаются, поэтому потребление памяти не так велико.

Прелесть объектно-ориентированного программирования, инкапсуляции и фасадов в том, что никому нет дела до того, что вы делаете внутри, если API делает то, что должен. Тот, кто использует ваш TreeNode, не должен знать, как он функционирует внутри. Просто иди с тем, что чувствует себя хорошо. Правильно спроектируйте свои API-интерфейсы, и вы сможете в любое время изменить внутренние компоненты.

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