Skip to content

Commit 393a0e2

Browse files
authored
Merge pull request #12 from ValentinKozlov/main
Пример структуры репозитория для управления архитектурой
2 parents c71254a + 0a8bd31 commit 393a0e2

66 files changed

Lines changed: 1141 additions & 2 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
6. [Встраивание виджетов в представления стандартных сущностей](src/widgets)
2020
7. [Управление процессом развертывания систем в кластерах](src/deployment_units_management)
2121
8. [Примеры запросов JSONata](src/jsonata_query_examples)
22+
9. [Пример структуры репозитория для управления архитектурой](src/repository_structure_example)
23+
2224

2325
## Разворачивание
2426

dochub.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@ imports:
1414
# 7. Пример управления процессом развертывания систем в кластерах
1515
# - src/deployment_units_management/dochub.yaml
1616
# 8. Примеры запросов JSONata
17-
- src/jsonata_query_examples/dochub.yaml
17+
# - src/jsonata_query_examples/dochub.yaml
18+
# 9. Пример структуры репозитория для управления архитектурой
19+
- src/repository_structure_example/dochub.yaml
Loading
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
imports:
22
- systems/_root.yaml
33
- docs.yaml
4+
- functions.yaml
45

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
functions:
2+
# Описание
3+
# Функция формирует строку ресурсов для вывода в карточке развертывания системы. На вход принимает 3 парметра:
4+
# context - сюда мы передаем значения ресурсов
5+
# mult - мулитипликатор, т.е. у каждой среды есть мультиплкатор на который мы увеличиваем ресурсы, если не нужно увеличивать, то передаем 1
6+
# output_type - вид возвращаемой строк: short - короткий варинат без типов ресурсов, full - полный вариант
7+
8+
# Примеры
9+
# $eval($functions.get_resources,{"context": $, "mult": multiplier, "output_type": "short"})
10+
# $eval($functions.get_resources,{"context": $, "mult": 1, "output_type": "full"})
11+
get_resources: >
12+
(
13+
$context := $.context;
14+
$mult := $.mult;
15+
$output_type := $.output_type;
16+
$output_type = "short"
17+
? "RAM: " & $context.ram * $mult & "Gb" & "\n"
18+
& "CPU: " & $context.cpu * $mult & "Core" & "\n"
19+
& ($context.storage_size > 0
20+
? "Storage: " & $context.storage_size * $mult & "Gb")
21+
: "RAM: " & $context.ram * $mult & "Gb" & "\n"
22+
& "CPU type: " & $context.cpu_type & "\n"
23+
& "CPU: " & $context.cpu * $mult & "Core" & "\n"
24+
& ($context.storage_size > 0
25+
? "Storage type: " & $context.storage_type & "\n"
26+
& "Storage: " & $context.storage_size * $mult & "Gb" : "")
27+
)
28+

src/jsonata_query_examples/jsonata_query_example.md

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,4 +286,44 @@ components:
286286
? $append($account, $);
287287
));
288288
)
289-
```
289+
```
290+
## Как переиспользовать код
291+
292+
В классическом понимании, функции в JSONata работают только внутри одного алгоритма, т.е. если вам нужно внутри одного алгоритма переиспользовать какой-то кусок кода, то вы можете выделить его в функцию. При этом нет такого понятия как объявить глобальную функцию и использовать её везде где нам нужно. Детально об использовании функций можно почитать в документации по JSONata в разделе ["Функциональное программирование"](http://docs.jsonata.org/programming).
293+
294+
Что же делать если нам нужно переиспользовать один кусок кода для разных алгоритмов?
295+
Есть альтернативное решение - это объявить переиспользуемый кусок кода и импортировать его в общее хранилище данных DocHub. После этого вы сможете выполнять описанный кусок вашего кода через специальную функцию $eval(), при этом функция $eval(expr [, context]) в качестве второго параметра может принимать контекст, что по факту можно использовать как параметры функции.
296+
297+
Так как не специалист в JSONata, то моё объяснение может кому-то показаться колхозным, поэтому если у вас есть более правильное объяснение, то делайте MR.
298+
299+
Давайте рассмотрим пример:
300+
1. Создадим yaml файл где у нас будут храниться куски кода, которые мы хотим переиспользовать в разных алгоритмах. Например, у нас этот файл хранится по следующему пути: `./functions.yaml`
301+
2. Объявим и опишем код
302+
```yaml
303+
functions:
304+
get_resources: >
305+
(
306+
$context := $.context;
307+
$mult := $.mult;
308+
$output_type := $.output_type;
309+
$output_type = "short"
310+
? "RAM: " & $context.ram * $mult & "Gb" & "\n"
311+
& "CPU: " & $context.cpu * $mult & "Core" & "\n"
312+
& ($context.storage_size > 0
313+
? "Storage: " & $context.storage_size * $mult & "Gb")
314+
: "RAM: " & $context.ram * $mult & "Gb" & "\n"
315+
& "CPU type: " & $context.cpu_type & "\n"
316+
& "CPU: " & $context.cpu * $mult & "Core" & "\n"
317+
& ($context.storage_size > 0
318+
? "Storage type: " & $context.storage_type & "\n"
319+
& "Storage: " & $context.storage_size * $mult & "Gb" : "")
320+
)
321+
```
322+
3. Вызовем кусок нашего кода с разными параметрами в редакторе JSONata
323+
```yaml
324+
(
325+
$functions := functions;
326+
$eval($functions.get_resources,{"context": {"ram": 2, "cpu": 8, "storage_size": 5}, "mult": 4, "output_type": "short"});
327+
$eval($functions.get_resources,{"context": {"ram": 2, "cpu_type": "standart", "cpu": 8, "storage_type": "standart", "storage_size": 5}, "mult": 1, "output_type": "full"});
328+
)
329+
```
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# Пример структуры репозитория для описания архитектуры
2+
3+
**Цель примера:** Снизить порог вхождения в DocHub за счет внедрения типовых шаблонов структуры репозитория и меню DocHub для управления корпоративной архитектурой.
4+
5+
# Суть примера
6+
Существует множество различных подходов к описанию архитектуры компании. В нашей компании была выбрана методология TOGAF. При этом мы не пытаемся внедрить классическую методологию TOGAF, мы используем комбинированный подход, выбирая только те инструменты, которые закрывают наиболее критичные риски компании.
7+
8+
Согласно методологии TOGAF архитектура предприятия делится на 4 домена:
9+
10+
1. Бизнес-архитектура - описание бизнес-процессов компании
11+
2. Информационная архитектура - описание архитектуры данных
12+
3. Прикладная архитектура - описание архитектуры программных продуктов (системы, сервисы, приложения и т.д.)
13+
4. Технологическая архитектура - описание архитектуры инфраструктуры
14+
15+
![TOGAF](./images/arch_approach.png)
16+
17+
Вся структура примера разработана под выбранную методологию с учетом нашего видения. В общем случае в данном репозитории мы ведем прикладную архитектур ровня ПА-L1, но если у системы нет своего репозитория, либо у архитектора несколько систем, то он может управлять в этом репозитории и уровнем ПА-L2.
18+
19+
## Файловая структура примера
20+
* **application_arch** - в этой папке хранятся все данные, связанные с прикладной архитектурой, кроме контекстов. Контексты мы вынесли в отдельную папку artefacts. Детально про artefacts можно почитать ниже.
21+
* **systems** - в этой папке хранятся данные по системам. Каждую систему мы описываем в своём файле и имя файла всегда соответствует имени системы. Идентификатор системы в общем случае представляет из себя доменное имя в виде: `<имя компании>.<имя бизнес-юнита>.<имя системы>`. Если вдруг у системы нет своего репозитория, то в этом файле мы также описываем runtime компоненты этой системы, что позволяет хранить всю информацию по системе в одном месте.
22+
* **artefacts** - в этой папке мы храним все артефакты по системам, например контексты мы храним в такой структуре: `./artefacts/<имя бизнес-юнита>/<имя контекста>`. Также здесь мы храним различные схемы по системам.
23+
* **business_arch** - в этой папке хранятся все данные, связанные с бизнес-архитектурой. На текущий момент мы не ведем в DocHub бизнес-архитектуру. Возможно, суда будем класть архитектурные скетчи, когда Рома закончит встраивать в DocHub https://excalidraw.com/
24+
* **dictionaries** - вспомогательная папка для хранения справочной информации. Например, при заполнении системы встал вопрос по её статусе, и чтобы не дублировать каждый раз всю информацию по статусу мы сделали справочник статусов и в системе используем только идентификатор, а если нам нужна полная информация, то получаем её при помощи функции $lookup внутри запроса.
25+
* **enterprise_arch** - это папка корпоративных архитекторов, сюда мы помещаем всю информацию, которая связана с развитием архитектуры в компании.
26+
* **adr** - в этой папке мы храним реестр архитектурных решений
27+
* **processes** - в этой папке мы храним документацию по различным архитектурным процессам
28+
* **tools** - в этой папке мы храним документацию по инструментам архитектуры
29+
* **dochub** - в этой папке мы храним документацию по DocHub
30+
* **welcome** - в этой папке мы храним документацию, которая выводится при открытии DocHub (welcome page)
31+
* **images** - картинки для настоящей документации
32+
* **information_arch** - в этой папке хранятся все данные, связанные с информационной архитектурой. На текущий момент мы в начале пути и сделали пока только прототип по управлению бизнес-сущностями на логическом уровне.
33+
* **settings** - здесь мы храним всякие настройки
34+
* **datasets** - здесь у нас общие запросы
35+
* **jsonata** - здесь у нас общие функции. Пример использования можно посмотреть [здесь](https://github.com/rpiontik/DocHubExamples/blob/main/src/jsonata_query_examples/jsonata_query_example.md).
36+
* **validators** - здесь мы описываем валидаторы, которые нужно выводить в общее меню проблем. Пример использования можно посмотреть [здесь](https://github.com/rpiontik/DocHubExamples/tree/main/src/validator_example)
37+
* **standards** - это одна из ключевых папок, где мы храним архитектурные принципы и стандарты, которые обязательны к выполнению всеми командами
38+
* **arch_principles** - здесь у нас описаны архитектурные принципы и принципы информационной безопасности
39+
* **it_platforms** - здесь мы храним архитектурные стандарты по платформам, а также принятые нотации по кодированию
40+
* **patterns** - здесь мы описываем различные паттерны, которые могут использовать наши команды. В примере есть пример реализации одного из таких паттернов.
41+
* **tech_arch** - в этой папке хранятся все данные, связанные с технологической архитектурой. Сейчас мы пока реализовали процесс управления развертыванием систем. Пример использования можно посмотреть [здесь](https://github.com/rpiontik/DocHubExamples/tree/main/src/deployment_units_management)
42+
* **_root.yaml** - корневой файл для импорта
43+
* **dochub.yaml** - корневой файл DocHub
44+
* **README.md** - текущая документация
45+
46+
## Правила импорта yaml файлов
47+
Импорт всех файлов делается только через `_root.yaml`. Это означает что при создании любой папки всегда нужно сначала добавлять `_root.yaml`, а уже внутри подключать файлы.
48+
Такой подход позволяет очень быстро переструктурировать папки репозитория, а также избегать множественного импорта при подключении репозитория как подмодуль.
49+
50+
## Пример целевого меню
51+
Мы не дождались пока Рома сделает кастомный вариант меню, поэтому в web версии переделали его по себя. Ниже наша версия такого меню:
52+
53+
![Menu](./images/menu_example.jpg)
54+
55+
Найти реализованный пример на базе entity можно здесь:
56+
![Menu](./images/menu_dochub.jpg)
57+
58+
59+
## Использование
60+
Скачайте себе пример и "потыкайте" каждый пункт меню, думаю найдете что-нибудь интересное :-).
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
imports:
2+
- business_arch/_root.yaml
3+
- information_arch/_root.yaml
4+
- application_arch/_root.yaml
5+
- tech_arch/_root.yaml
6+
- artefacts/_root.yaml
7+
- dictionaries/_root.yaml
8+
- enterprise_arch/_root.yaml
9+
- settings/_root.yaml
10+
- standards/_root.yaml
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
imports:
2+
- systems/_root.yaml
3+
- docs.yaml
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Прикладная архитектура находится в разработке

0 commit comments

Comments
 (0)