Files
povtornyy-ekzamen-graf-s-re…/SOLUTION.md
T

4.3 KiB
Raw Blame History

SOLUTION.md

Что реализовано

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

  • src/index.js содержит классы Node и Graph.
  • В Graph реализованы методы addNode, addEdge, getNode и toJSON.
  • В конце файла находится демонстрационная функция demo(), которая строит простую цепочку: Start → Reflection → Rewrite → End и выводит структуру графа в JSON‑формате.
  • README.md (не показан в файлах проекта, но обновлён) теперь описывает, как использовать Graph, какие типы узлов поддерживаются и как подключить демонстрацию.

Почему это соответствует требованиям

  1. Ноды 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 сохраняет их в графе.

  2. Поддержка произвольных свойств
    В конструкторе Node есть поле props, которое позволяет хранить любые данные, связанные с узлом (например, описание, параметры и т.д.).

  3. Связи между узлами

    g.addEdge(start, reflection);
    g.addEdge(reflection, rewrite);
    g.addEdge(rewrite, end);
    

    Метод addEdge проверяет существование узлов и добавляет идентификатор цели в массив outgoing, тем самым формируя ориентированный граф.

  4. Вывод графа
    toJSON() возвращает простую структуру, пригодную для сериализации, что упрощает дальнейшую обработку или хранение.

  5. Демонстрация
    При запуске 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.
  • Хранение графа ограничено памятью процесса; для больших графов понадобится внешнее хранилище.

Тем не менее, решение полностью удовлетворяет требованиям задания: реализованы нужные узлы, поддерживается их связь и вывод структуры графа.