Baigudin Software avatar
Baigudin Software logo
home
ru region
en region

PHP DOM Builder API 2.0

BOOS Core представлено в версии 2.1

Новый релиз ядра BOOS Core получил ARM архитектуру с набором команд версии 5, независимые от средств компиляции алгоритмы, единый корневой интерфейс и ещё много новых аспектов.

Оптимизация исходного кода

«Если ты что-то написал и это работает, то лучше задержать дыхание и не дышать – пусть работает». Хорошее утверждение, но если это работает, но медленно или не гибко? Приходится оптимизировать, затем отлаживать и ещё раз тестировать. Понятно, что компромисс между удобством и быстродействием порой найти не так просто. Но о нем стоит задуматься на этапе проектирования, и будущее будет проще.

Оптимизация выборки

Основное правило, которое необходимо запомнить – это то, что результаты поиска не кэшируются. Запрашивая поиск в пределах любой ветки дерева, вы начинаете проходить её снова и снова. Поэтому, чем меньше ветка, тем быстрее поиск.

Лучше сохранять результаты поиска во временные переменные:

<?php
// Плохо
$document->find('a')->addClass('link');
$document->find('a')->attr('href''baigudin.software');
// Хорошо
$node $document->find('a')->addClass('link');
$node->attr('href''baigudin.software');
?>

Можно использовать цепочки вызовов:

<?php
// И так хорошо
$document->find('a')->addClass('link')->attr('href''baigudin.software');
?>

Обрезаем дерево до веток «div.article»:

<?php
// Плохо
$document->find('div.article h2');
$document->find('div.article a');
// Хорошо
$node $document->find('div.article');
$node->find('h2');
$node->find('a');
?>

Индексирование узлов

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

<?php
use DomBuilder\Element as Element;
// Создаём документ
$document Element::create()
  ->
insert('html')
    ->
insert('head')
      ->
after('body')->root();
// Создаём пустой список
$list Element::newList();
// Добавляем в список узлы с ключами
$list->pushElement::create('h1')->html('Заголовок')->key('header') );
$list->pushElement::create('p')->html('Текст') )->key('text');
// Добавляем узлы из списка в документ по их ключу
$document->find('body')
  ->
insert$list->get('header') )
  ->
after$list->get('text') );
// Выводим документ
echo Element::getDocument($document);
?>

Здесь стоит отметить, что присвоение ключа узлу можно выполнить как на стадии формирования самого узла, так и при добавлении его в список. Вызов метода key у объекта ElementList приведёт к присвоению переданного ключа последнему добавленному узлу.

Функционал библиотеки не следит за уникальностью ключа. Ключ необходим лишь для ассоциации узла в списке. Таким образом, если в список будут добавлены два узла с одинаковыми ключами, то ассоциирован будет последний добавленный.

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

К предыдущей статье

К списку статей

К следующей статье