Stage-2 » История » Версия 8
Александр Александров, 05.10.2019 00:51
1 | 1 | Александр Александров | h1. План работы |
---|---|---|---|
2 | |||
3 | 3 | Александр Александров | Работа над тестовым заданием: |
4 | 2 | Александр Александров | |
5 | 3 | Александр Александров | * Схематично отразить работу программы, рассмотреть несколько вариантов работы, где должно быть отражено успех программы или неуспех. Это наглядно покажет как должна работать программа. |
6 | * Схематично отразить работу программы, рассмотреть несколько вариантов работы, где должны быть отражены успешные и не успешные запросы к сервису. Это наглядно покажет как должна работать программа. |
||
7 | * Создать структуру веб-приложения работающего как REST-сервис. |
||
8 | * Создание основной бизнес логики. |
||
9 | * Покрытие тестами. |
||
10 | 4 | Александр Александров | |
11 | ---- |
||
12 | |||
13 | h1. Структура данных. |
||
14 | |||
15 | h2. Входные данные |
||
16 | |||
17 | h3. Граф |
||
18 | |||
19 | 6 | Александр Александров | Входными данными будет граф G(V,E), где V - множество вершин графа (ноды), E - множество рёбер, соединяющих вершины. Граф не ориентированный. Сама вершина (нода) представляет собой объект, состоящий из уникального имени и числа с плавающей запятой в диапазоне от 0 до 100, описывающая вероятность отказы ноды. Ребро представляет собой объект состоящий из двух ссылок на вершины, которые это ребро соединяет, в данном случае под ссылками подразумевается уникальное имя ноды. В формате JSON это будет выглядеть так: |
20 | 4 | Александр Александров | |
21 | <pre> |
||
22 | 6 | Александр Александров | [[{”name”:”name_of_node_unique”, “probability”:50}, ...],[{”node1”:ref_to_node1, “node2”:ref_to_node2}, ...]] |
23 | 4 | Александр Александров | </pre> |
24 | |||
25 | , где |
||
26 | |||
27 | 6 | Александр Александров | _{”name”:”name_of_node_unique”, “probability”:50}_ - объект описывающий вершину графа (ноду) |
28 | 4 | Александр Александров | _{”node1”:ref_to_node1, “node2”:ref_to_node2}_ - объект описывающий ребро, соединяющее две вершины графа. |
29 | |||
30 | *Примеры входных графов* |
||
31 | |||
32 | {{dmsf_image(134)}} |
||
33 | |||
34 | Циклический граф |
||
35 | |||
36 | {{dmsf_image(131)}} |
||
37 | |||
38 | Ациклический граф |
||
39 | |||
40 | Входные графы могут содержать циклы, которые нужно исключить по условию задачи. |
||
41 | |||
42 | h3. Вершины графа (Ноды) |
||
43 | |||
44 | Так же на вход будут подаваться списки вершин графа для проверки связности вершин. Представляет собой простой перечень вершин, можно указать или идентификатор вершины или уникальное имя. |
||
45 | В представлении JSON будет выглядеть так: |
||
46 | |||
47 | <pre> |
||
48 | [node_id, node_id, ...] |
||
49 | </pre> |
||
50 | |||
51 | ,где node_id уникальный идентификатор вершины. |
||
52 | |||
53 | или так |
||
54 | |||
55 | <pre> |
||
56 | [”node_name”, “node_name”, ...] |
||
57 | </pre> |
||
58 | |||
59 | , где node_name - уникальное имя вершины. |
||
60 | |||
61 | Уникальный идентификатор или имя вершины извлекается запросом или из сервиса (возвращается в формате JSON) или из БД. |
||
62 | |||
63 | h2. Структура выходных данных |
||
64 | |||
65 | При запросе к сервису можно получить список вершин (нод) в следующем формате |
||
66 | |||
67 | <pre> |
||
68 | 7 | Александр Александров | [{”id”:1, “name”:”unique_name”, “probability”:50, “counter”:0}, ...] |
69 | 4 | Александр Александров | </pre> |
70 | |||
71 | 7 | Александр Александров | ,где: id - уникальный идентификатор вершины, name - уникальное имя вершины, probability - вероятность отказа вершины, counter - счётчик посещения вершины. |
72 | 4 | Александр Александров | |
73 | h2. Модель хранения данных |
||
74 | |||
75 | Класс *Node* - описывающий модель вершины графа (ноды). Класс состоит из следующих полей: |
||
76 | *id* - уникальный идентификатор. |
||
77 | *name* - уникальное имя узла (получаем из json). |
||
78 | *probability* - вероятность отказа узла (получаем из json). |
||
79 | *counter* - при каждом удачном проходе маршрута, через ноду, счётчик ноды увеличивается. |
||
80 | |||
81 | |||
82 | Класс *Edge* - описывающий модель ребра графа. Класс состоит из следующих полей: |
||
83 | *node1* - ссылка на первую ноду |
||
84 | *node2* - ссылка на вторую ноду |
||
85 | |||
86 | |||
87 | h2. Модель хранения данных в БД |
||
88 | |||
89 | {{dmsf_image(135)}} |
||
90 | |||
91 | 5 | Александр Александров | Связь many-to-many |
92 | |||
93 | 4 | Александр Александров | Предварительно скрипт создания таблиц будет выглядеть так |
94 | |||
95 | <pre><code class="sql"> |
||
96 | CREATE TABLE NODES( |
||
97 | ID INT NOT NULL AUTO_INCREMENT, |
||
98 | NAME VARCHAR(50) NOT NULL, |
||
99 | PROBABILITY FLOAT DEFAULT 0.5 NOT NULL, |
||
100 | COUNTER INT DEFAULT 0 NOT NULL, |
||
101 | PRIMARY KEY (ID) |
||
102 | ); |
||
103 | |||
104 | CREATE TABLE EDGES( |
||
105 | NODE1_ID INT NOT NULL, |
||
106 | NODE2_ID INT NOT NULL, |
||
107 | FOREIGN KEY (NODE1_ID) REFERENCES NODE(ID), |
||
108 | FOREIGN KEY (NODE2_ID) REFERENCES NODE(ID), |
||
109 | CHECK (NODE1_ID <> NODE2_ID), |
||
110 | CONSTRAINT UNIQ_EDGE UNIQUE (NODE1_ID,NODE2_ID) |
||
111 | ); |
||
112 | </code></pre> |