wiki:ru/DOM

Version 4 (modified by vadim.godunko, 9 years ago) ( diff )

--

Пример API без использования ссылочных типов:

   type DOM_Node is tagged private;

   type DOM_Document is new DOM_Node with private;
   type DMO_Element is new DOM_Node with private;

   function Is_Document (Self : DOM_Node) return Boolean;
   function Is_Element (Self : DOM_Node) return Boolean;

   function To_Document (Self : DOM_Node) return DOM_Document;
   function To_Element (Self : DOM_Node) return DOM_Element;

Т.е. все узлы приватного тэгового типа. Наследование повторяет настелование в спецификации. Для каждого типа есть запрос а является ли текущий элемент элементом этого типа и соответствующая подпрограмма преобразования.

Адапрация DOM для Ada

Можно сделать DOM API более "похожим" на Ada, в частности класс CharacterData имеет несколько подпрограмм работы со строками, в которых доступ осуществляется через смещение:длину, а не позиционно, как в Ada. Поскольку мы не претендуем на иеальность соответствия, можно переделать эти подпрограмм на использование индекса первого/индекса последнего символа и нумеровать символы с 1 (в любом случае мы уже отошли от рекомендации, правда в дозволенных пределах, когда начали представлять данные в виде Unicode строк, а не 16-битных кодов).

Управление памятью

Хочется иметь простой и понятный способ автоматического управления динамической памятью.

Использование подсчёта ссылок

В дереве DOM недопустимы циклические графы, это позволяет использовать простой алгоритм подсчёта ссылок. Для устранения проблемы со ссылками двух узлов друг на друга в отношении родитель-потомки родительский узел увеличивает счётчик ссылок дочернего узла при добавлении в список потомков. Каждый объект-обёртка также увеличивает счётчик ссылок при использовании внутреннего узла.

При всём этом возникают следующие концептуальные проблемы:

  • если последняя ссылка на родительский узел теряется, но при этом остаётся ссылка на дочерний элемент, получается что родительский элемент уничтожается, у дочернего обнуляется свойство-ссылка на родительский узел. Как вариант решения можно все "висящие" элементы соединять с DOM::Document их создавшим. Но это не решает следующей проблемы;
  • если последняя ссылка на DOM::Document тряется, но при этом остаются ссылки на дочерние узлы - документ частично разрушается. Пока не понятно как это преодолеть.

Альтернативный вариант

Альтернативный вариант заключается в том, что всегда используется счётчик ссылок документа для узлов, являющихся частью документа; либо счётчик ссылок корневого узла некоторого поддерева, не являющегося частью документа. При подключении поддерева к основному дереву документа значение счётчика ссылок документа увеличивается на значение счётчика ссылок корня поддерева, после чего значение счётчика ссылок корня поддерева сбрасывается. При отделении поддерева от документа необходимо как-то откорректировать значение счётчиков в противоположном порядке. Но не ясно как учитывать ссылки на элементы всего отделяемого поддерева.

Note: See TracWiki for help on using the wiki.