50 lines
2.7 KiB
Markdown
50 lines
2.7 KiB
Markdown
**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** – добавление рефлексивных ребер
|
||
```js
|
||
addReflexiveEdges() {
|
||
for (const id of this.nodes.keys()) {
|
||
this.adj.get(id).add(id);
|
||
}
|
||
}
|
||
```
|
||
|
||
**src/ui.js** – рендер графа в контейнер
|
||
```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** – проверка рефлексивных ребер
|
||
```js
|
||
test('adds reflexive edges', () => {
|
||
g.addReflexiveEdges();
|
||
expect(g.neighbors('1')).toContain('1');
|
||
});
|
||
```
|
||
|
||
### Ограничения
|
||
- Нет серверной части – граф хранится только в памяти клиента.
|
||
- Отсутствует экспорт/импорт графа в/из файлов (только JSON в памяти).
|
||
- UI простая, без возможности редактирования графа пользователем.
|
||
|
||
Тем не менее, решение полностью соответствует заданию и демонстрирует работу графа с рефлексией на чистом JavaScript. |