80 lines
4.3 KiB
Markdown
80 lines
4.3 KiB
Markdown
**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.
|
||
- Хранение графа ограничено памятью процесса; для больших графов понадобится внешнее хранилище.
|
||
|
||
Тем не менее, решение полностью удовлетворяет требованиям задания: реализованы нужные узлы, поддерживается их связь и вывод структуры графа. |