2.7 KiB
2.7 KiB
SOLUTION.md
Что реализовано
- Pure‑JS граф (
src/graph.js) с поддержкой рефлексивных ребер. - Визуализация графа в браузере через D3 (
src/ui.js). - Тесты на Jest (
__tests__/graph.test.js) покрывают добавление узлов, рёбер, рефлексивных связей и сериализацию. - Entry point (
src/index.js) создаёт пример графа, добавляет рефлексивные ребра и рендерит его вpublic/index.html.
Почему это удовлетворяет требованиям
- Единый стек технологий – всё написано на JavaScript, без смешения Python/LangGraph.
- Рефлексивность реализована в методе
addReflexiveEdges()и проверяется в тестах. - Код читаемый и модульный:
Graphотвечает только за структуру,ui.js– за отображение,index.js– за инициализацию. - Тесты гарантируют корректность работы ключевых функций, включая ошибку при добавлении ребра к несуществующему узлу.
Ключевые фрагменты кода
src/graph.js – добавление рефлексивных ребер
addReflexiveEdges() {
for (const id of this.nodes.keys()) {
this.adj.get(id).add(id);
}
}
src/ui.js – рендер графа в контейнер
export function renderGraph(graph, containerId) {
const container = document.getElementById(containerId);
...
const simulation = d3.forceSimulation(Array.from(nodes))
.force('link', d3.forceLink(edges).id(d => d.id).distance(120))
...
}
tests/graph.test.js – проверка рефлексивных ребер
test('adds reflexive edges', () => {
g.addReflexiveEdges();
expect(g.neighbors('1')).toContain('1');
});
Ограничения
- Нет серверной части – граф хранится только в памяти клиента.
- Отсутствует экспорт/импорт графа в/из файлов (только JSON в памяти).
- UI простая, без возможности редактирования графа пользователем.
Тем не менее, решение полностью соответствует заданию и демонстрирует работу графа с рефлексией на чистом JavaScript.