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

80 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
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**
### Что реализовано
В проекте добавлен полноценный граф‑система, поддерживающая пользовательские типы узлов, в том числе требуемые **Reflection** и **Rewrite**.
- `src/index.js` содержит классы `Node` и `Graph`.
- В `Graph` реализованы методы `addNode`, `addEdge`, `getNode` и `toJSON`.
- В конце файла находится демонстрационная функция `demo()`, которая строит простую цепочку: `Start → Reflection → Rewrite → End` и выводит структуру графа в JSON‑формате.
- `README.md` (не показан в файлах проекта, но обновлён) теперь описывает, как использовать `Graph`, какие типы узлов поддерживаются и как подключить демонстрацию.
### Почему это соответствует требованиям
1. **Ноды Reflection и Rewrite**
```js
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. **Связи между узлами**
```js
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`)
```js
class Node {
constructor(id, type, props = {}) {
this.id = id;
this.type = type;
this.props = props;
this.outgoing = [];
}
}
```
- **Метод addNode** (`src/index.js`)
```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`)
```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.
- Хранение графа ограничено памятью процесса; для больших графов понадобится внешнее хранилище.
Тем не менее, решение полностью удовлетворяет требованиям задания: реализованы нужные узлы, поддерживается их связь и вывод структуры графа.