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

50 lines
2.7 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
**SOLUTION.md**
### Что реализовано
- **PureJS граф** (`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.