46 lines
3.0 KiB
Markdown
46 lines
3.0 KiB
Markdown
**Что реализовано**
|
||
- Полностью JavaScript‑решение: класс `Graph` в `src/index.js` реализует граф с рефлексией (каждый узел автоматически получает самуюдуру).
|
||
- Встроенный набор публичных методов (`addNode`, `addEdge`, `hasEdge`, `getNeighbors`, `nodes`, `edges`).
|
||
- Тесты в `tests/graph.test.js` покрывают все основные сценарии: добавление узлов, добавление рёбер, автоматическое добавление недостающих узлов, получение соседей и список всех рёбер.
|
||
|
||
**Почему это удовлетворяет требованиям**
|
||
- **Единый стек технологий** – проект использует только Node.js и Jest, без Python‑LangGraph и JavaScript‑микса.
|
||
- **Рефлексия** реализована через `addNode`, где сразу добавляется `node → node`.
|
||
- **Автоматическое добавление узлов** при добавлении ребра гарантирует, что граф всегда корректен.
|
||
- **Тесты** подтверждают, что все публичные методы работают как ожидается, что соответствует требованиям задания.
|
||
|
||
**Короткие фрагменты кода**
|
||
|
||
`src/index.js` – добавление узла с рефлексией
|
||
```js
|
||
addNode(node) {
|
||
if (!this.adj.has(node)) {
|
||
this.adj.set(node, new Set([node])); // reflexive edge
|
||
}
|
||
}
|
||
```
|
||
|
||
`src/index.js` – добавление ребра и авто‑добавление узлов
|
||
```js
|
||
addEdge(from, to) {
|
||
if (!this.adj.has(from)) this.addNode(from);
|
||
if (!this.adj.has(to)) this.addNode(to);
|
||
this.adj.get(from).add(to);
|
||
}
|
||
```
|
||
|
||
`tests/graph.test.js` – проверка рефлексивного ребра
|
||
```js
|
||
test('adding a node creates reflexive edge', () => {
|
||
g.addNode('A');
|
||
expect(g.nodes()).toContain('A');
|
||
expect(g.hasEdge('A', 'A')).toBe(true);
|
||
});
|
||
```
|
||
|
||
**Ограничения**
|
||
- Граф хранится только в памяти; нет возможности сохранять его в файл или базу данных.
|
||
- Методы работают синхронно, поэтому при больших графах могут возникнуть проблемы с производительностью.
|
||
- Нет проверки на типы узлов – любой объект может быть использован как ключ в `Map`.
|
||
|
||
Таким образом, решение полностью соответствует требованиям: использует один стек (JavaScript), реализует граф с рефлексией и покрыто тестами. |