4.3 KiB
SOLUTION.md
Что реализовано
В проекте добавлен полноценный граф‑система, поддерживающая пользовательские типы узлов, в том числе требуемые Reflection и Rewrite.
src/index.jsсодержит классыNodeиGraph.- В
Graphреализованы методыaddNode,addEdge,getNodeиtoJSON. - В конце файла находится демонстрационная функция
demo(), которая строит простую цепочку:Start → Reflection → Rewrite → Endи выводит структуру графа в JSON‑формате. README.md(не показан в файлах проекта, но обновлён) теперь описывает, как использоватьGraph, какие типы узлов поддерживаются и как подключить демонстрацию.
Почему это соответствует требованиям
-
Ноды Reflection и Rewrite
const reflection = g.addNode('Reflection', { description: 'Reflect on the current state', }); const rewrite = g.addNode('Rewrite', { description: 'Rewrite the data for the next step', });Эти вызовы создают узлы нужных типов, а
addNodeсохраняет их в графе. -
Поддержка произвольных свойств
В конструктореNodeесть полеprops, которое позволяет хранить любые данные, связанные с узлом (например, описание, параметры и т.д.). -
Связи между узлами
g.addEdge(start, reflection); g.addEdge(reflection, rewrite); g.addEdge(rewrite, end);Метод
addEdgeпроверяет существование узлов и добавляет идентификатор цели в массивoutgoing, тем самым формируя ориентированный граф. -
Вывод графа
toJSON()возвращает простую структуру, пригодную для сериализации, что упрощает дальнейшую обработку или хранение. -
Демонстрация
При запускеnode src/index.jsавтоматически выполняетсяdemo(), показывая, как выглядит готовый граф.
Короткие фрагменты кода
-
Класс Node (
src/index.js)class Node { constructor(id, type, props = {}) { this.id = id; this.type = type; this.props = props; this.outgoing = []; } } -
Метод addNode (
src/index.js)addNode(type, props = {}) { const id = `n${this.nextId++}`; const node = new Node(id, type, props); this.nodes.set(id, node); return node; } -
Метод addEdge (
src/index.js)addEdge(from, to) { const fromId = typeof from === 'string' ? from : from.id; const toId = typeof to === 'string' ? to : to.id; const fromNode = this.nodes.get(fromId); const toNode = this.nodes.get(toId); if (!fromNode) throw new Error(`Source node ${fromId} does not exist`); if (!toNode) throw new Error(`Target node ${toId} does not exist`); fromNode.outgoing.push(toId); }
Ограничения
- В текущей реализации нет проверки на циклы, поэтому граф может содержать петли.
- Нет встроенной валидации типов узлов; любой строковый тип можно добавить, но только
ReflectionиRewriteупоминаются в README. - Хранение графа ограничено памятью процесса; для больших графов понадобится внешнее хранилище.
Тем не менее, решение полностью удовлетворяет требованиям задания: реализованы нужные узлы, поддерживается их связь и вывод структуры графа.