[Перевод] Structurizr, описание, перевод (часть 2/3)

b03708e7541075f4c8bb33ac24abd460.png

Введение

В данной статье содержится вольный перевод документации по Structurizr.

Из-за большого объема информация разделена на три статьи:

Общая информация

Угловые скобки (<...>) показывают обязательные свойства.

Квадратные скобки ([…]) показывают необязательные свойства.

Большинство инструкций имеют вид: ключевое слово <обязательные свойства> [необязательные свойства].

workspace

workspace — языковая конструкция верхнего уровня и оболочка для модели и представлений. Рабочей области можно присвоить имя и описание:

workspace [name] [description] {
    ...
}

Рабочая область также может расширять другую рабочую область, добавляя в нее больше элементов, связей, представлений и так далее.

workspace extends  {
    ...
}

На базовую рабочую область можно ссылаться либо с помощью локального файла DSL/JSON, либо удаленного (через URL HTTPS) файла DSL/JSON. При расширении рабочей области на основе DSL все идентификаторы, определенные в этой рабочей области, доступны для использования в расширенной рабочей области.

Допустимые дочерние элементы:

  • name,

  • description,

  • properties,

  • ! docs,

  • ! adrs,

  • model,

  • views,

  • configuration.

model

Каждое рабочее пространство должно содержать блок model, внутри которого определены элементы и взаимосвязи.

model {
    ...
}

Допустимые дочерние элементы:

  • group,

  • person,

  • softwareSystem,

  • deploymentEnvironment,

  • element,

  • → (relationship).

enterprise

Конструкция устарела — вместо нее нужно использовать group.

Ключевое слово enterprise предоставляет способ определения именованного «предприятия» (например, организации) в рамках модели верхнего уровня. Любые люди или программные системы, определенные внутри этого блока, будут считаться «внутренними», в то время как все остальные будут считаться «внешними». На диаграммах системного ландшафта и системного контекста предприятие представлено в виде пунктирной рамки. В рамках модели может быть определено только одно предприятие.

enterprise [name] {
    ...
}

Допустимые дочерние элементы:

  • group,

  • person,

  • softwareSystem,

  • → (relationship).

group

Ключевое слово group предоставляет способ определения именованной группировки элементов, которая будет отображаться как граница вокруг этих элементов. Группы могут быть вложенными.

group  {
    ...
}

Группы могут использоваться только для группировки элементов одного типа (одного и того же уровня абстракции) следующим образом:

Местонахождение

Дочерние элементы

Model

People and software systems

Software System

Containers

Container

Components

person

Ключевое слово person определяет человека (пользователя, актера, роль или персону).

person  [description] [tags] {
    ...
}

По умолчанию добавляются следующие теги:

  • Element,

  • Person.

Допустимые дочерние элементы:

  • description,

  • tags,

  • url,

  • properties,

  • perspectives,

  • → (relationship).

softwareSystem

Ключевое слово определяет программную систему:

softwareSystem  [description] [tags] {
    ...
}

По умолчанию добавляются следующие теги:

  • Element,

  • Software System.

Допустимые дочерние элементы:

  • ! docs,

  • ! adrs,

  • group,

  • container,

  • description,

  • tags,

  • url,

  • properties,

  • perspectives,

  • → (relationship).

container

Ключевое слово определяет контейнер внутри программной системы.

container  [description] [technology] [tags] {
    ...
}

По умолчанию добавляются следующие теги:

  • Element,

  • Container.

Допустимые дочерние элементы:

  • ! docs,

  • ! adrs,

  • group,

  • component,

  • description,

  • technology,

  • tags,

  • url,

  • properties,

  • perspectives,

  • → (relationship).

component

Ключевое слово определяет компонент внутри контейнера.

component  [description] [technology] [tags] {
    ...
}

По умолчанию добавляются следующие теги:

  • Element,

  • Component.

Допустимые дочерние элементы:

  • ! docs,

  • ! adrs,

  • description,

  • technology,

  • tags,

  • url,

  • properties,

  • perspectives,

  • → (relationship).

deploymentEnvironment

Ключевое слово предоставляет способ определения среды развертывания (например, разработка, тестирование, промежуточная обработка, live и тому подобное).

deploymentEnvironment  {
    ...
}

Допустимые дочерние элементы:

  • group,

  • deploymentGroup,

  • deploymentNode,

  • → (relationship).

deploymentGroup

Ключевое слово предоставляет способ определения именованной группы развертывания.

deploymentGroup 

Когда экземпляры программной системы/контейнера добавляются в среду развертывания, все взаимосвязи между этими элементами автоматически реплицируются между всеми экземплярами. Группы развертывания предоставляют способ ограничить область, в которой реплицируются связи.

deploymentNode

Ключевое слово используется для определения узла развертывания.

deploymentNode  [description] [technology] [tags] [instances] {
    ...
}

По умолчанию добавляются следующие теги:

  • Element,

  • Deployment Node.

Допустимые дочерние элементы:

infrastructureNode

Ключевое слово определяет узел инфраструктуры, который обычно является чем-то вроде балансировщика нагрузки, брандмауэра, службы DNS и тому подобное.

infrastructureNode  [description] [technology] [tags] {
    ...
}

По умолчанию добавляются следующие теги:

  • Element,

  • Infrastructure Node.

Допустимые дочерние элементы:

  • (relationship),

  • description,

  • technology,

  • tags,

  • url,

  • properties,

  • perspectives.

softwareSystemInstance

Ключевое слово определяет экземпляр указанной программной системы, развернутый на родительском узле развертывания.

softwareSystemInstance  [deploymentGroups] [tags] {
    ...
}

identifier должен представлять программную систему, deploymentGroups — разделенный запятыми список идентификаторов, представляющих группы развертывания.

В дополнение к тегам программной системы по умолчанию добавляется тег Software System Instance.

Допустимые дочерние элементы:

  • (relationship),

  • description,

  • tags,

  • url,

  • properties,

  • perspectives,

  • healthCheck.

containerInstance

Ключевое слово определяет экземпляр указанного контейнера, который развертывается на родительском узле развертывания.

containerInstance  [deploymentGroups] [tags] {
    ...
}

identifier должен представлять контейнер, deploymentGroups — разделенный запятыми список идентификаторов, представляющих группы развертывания.

В дополнение к тегам контейнера, по умолчанию добавляется тег Container Instance.

Допустимые дочерние элементы:

  • (relationship),

  • description,

  • tags,

  • url,

  • properties,

  • perspectives,

  • healthCheck.

healthCheck

Ключевое слово определяет проверку работоспособности HTTP для экземпляра родительской программной системы или контейнера.

healthCheck   [interval] [timeout]

interval измеряется в секундах (по умолчанию 60 секунд), а timeout в миллисекундах (по умолчанию 0 мс).

element

Ключевое слово определяет пользовательский элемент (доступно только в облачном сервисе Structurizr/локальной установке/Lite).

element  [metadata] [description] [tags] {
    ...
}

По умолчанию добавляется тег Element.

Допустимые дочерние элементы:

  • description,

  • tags,

  • url,

  • properties,

  • perspectives,

  • → (relationship).

relationship

→ используется для определения однонаправленной связи между двумя элементами.

Существует два способа определения взаимосвязей. Первый — явно, где вы явно используете идентификатор источника:

 ->  [description] [technology] [tags] {
    ...
}

Например:

user -> softwareSystem "Uses"

Второй способ — неявно, когда источником отношения является элемент в области видимости:

->  [description] [technology] [tags]

Например:

person user {
    -> softwareSystem "Uses"
}

Это эквивалентно следующему коду, где специальный идентификатор this используется для ссылки на элемент в области видимости:

person user {
    this -> softwareSystem "Uses"
}

По умолчанию добавляется тег Relationship.

С помощью DSL можно создать следующие типы связей:

Источник

Целевой элемент

Person

Person, Software System, Container, Component

Software System

Person, Software System, Container, Component

Container

Person, Software System, Container, Component

Component

Person, Software System, Container, Component

Deployment Node

Deployment Node

Infrastructure Node

Deployment Node, Infrastructure Node, Software System Instance, Container Instance

Software System Instance

Infrastructure Node

Container Instance

Infrastructure Node

Допустимые дочерние элементы:

  • tags,

  • url,

  • properties,

  • perspectives.

tags

Используется для добавления тегов к элементу или взаимосвязи. Теги могут быть указаны через запятую или по отдельности.

tags "Tag 1"
tags "Tag 1,Tag 2"
tags "Tag 1" "Tag 2"

description

Используется для установки описания элемента или представления.

description "Description"

technology

Используется для установки технологии в контейнере, компоненте, узле развертывания, узле инфраструктуры.

technology "Technology"

instances

Используется для задания количества экземпляров узла развертывания. Это может быть либо статическое число, либо диапазон (например 0…1, 1…3, 5…10, 0… N, 0…, 1…N, 1… и тому подобное).

instances "4"
instances "1..N"

url

Используется для установки URL-адреса элемента или связи.

url 

properties

Блок properties используется для определения одного или нескольких свойств.

properties {
     
    ...
}

perspectives

Блок perspectives используется для определения одной или нескольких перспектив для элемента или взаимосвязи.

perspectives {
     
    ...
}

! ref

Ключевое слово предоставляет способ ссылки на ранее определенный элемент/взаимосвязь и предназначено для использования с функциями extends или ! include. Его можно использовать несколькими способами.

Первый сценарий использования заключается в ссылке на существующий элемент/взаимосвязь, которые были определены с помощью DSL. Это позволяет расширить элемент, на который ссылается данный идентификатор.

!ref  {
  ...
}

Или, если вы расширяете рабочее пространство на основе JSON, вы можете ссылаться на элемент по его «каноническому имени» и присваивать ему идентификатор.

 = !ref  {
  ...
}

views

Каждая рабочая область также может содержать одно или несколько представлений, определенных с помощью блока views.

views {
    ...
}

Блок views может содержать следующие элементы:

  • systemLandscape,

  • systemContext,

  • container,

  • component,

  • filtered,

  • dynamic,

  • deployment,

  • custom,

  • image,

  • styles,

  • theme,

  • themes,

  • branding,

  • terminology,

  • properties.

Если в рабочей области нет блока views или блок views не определяет никаких представлений, будет определен набор представлений по умолчанию. Определение одного или нескольких представлений в блоке views приведет к удалению этого представления по умолчанию, хотя при необходимости их можно добавить обратно с помощью скрипта:

!script groovy {
    workspace.views.createDefaultViews()
}

systemLandscape view

Ключевое слово используется для определения ландшафтного представления системы.

systemLandscape [key] [description] {
    ...
}

Будет сгенерирован ключ просмотра, если он не указан явно; автоматически сгенерированные ключи просмотра не гарантируют стабильности с течением времени, и информация о макете может быть потеряна при их использовании в сочетании со Structurizr Lite/локально/ облачно.

Допустимые дочерние элементы:

  • include,

  • exclude,

  • autoLayout,

  • default,

  • animation,

  • title,

  • description,

  • properties.

systemContext view

Ключевое слово используется для определения представления системного контекста указанной программной системы.

systemContext  [key] [description] {
    ...
}

Ключ представления будет сгенерирован автоматически, если он не указан явно; автоматически сгенерированные ключи не гарантируют стабильности с течением времени, и информация о макете может быть потеряна при их использовании в сочетании со Structurizr Lite/локально/ облачно.

Допустимые дочерние элементы:

  • include,

  • exclude,

  • autoLayout,

  • default,

  • animation,

  • title,

  • description,

  • properties.

container view

Ключевое слово для определения представления контейнера для указанной программной системы.

container  [key] [description] {
    ...
}

Ключ представления будет сгенерирован автоматически, если он не указан явно; автоматически сгенерированные ключи не гарантируют стабильности с течением времени, и информация о макете может быть потеряна при их использовании в сочетании со Structurizr Lite/локально/ облачно.

Допустимые дочерние элементы:

  • include,

  • exclude,

  • autoLayout,

  • default,

  • animation,

  • title,

  • description,

  • properties.

component view

Ключевое слово для определения представления компонентов для указанного контейнера.

component  [key] [description] {
    ...
}

Ключ представления будет сгенерирован автоматически, если он не указан явно; автоматически сгенерированные ключи не гарантируют стабильности с течением времени, и информация о макете может быть потеряна при их использовании в сочетании со Structurizr Lite/локально/ облачно.

Допустимые дочерние элементы:

  • include,

  • exclude,

  • autoLayout,

  • default,

  • animation,

  • title,

  • description,

  • properties.

filtered view

Ключевое слово для определения отфильтрованного представления поверх указанного представления.

filtered    [key] [description] {
    ...
}

Параметр baseKey определяет ключ системного ландшафта, системного контекста, контейнера или представления компонента, на котором должно основываться это отфильтрованное представление. Режим (include или exclude) определяет, должно ли представление включать или исключать элементы/взаимосвязи на основе предоставленных tags.

Как только отфильтрованный вид определен для указанного «базового вида», этот базовый вид больше не будет отображаться в списке диаграмм при использовании средства визуализации Structurizr. Это сделано специально. Если вы хотите просмотреть базовое представление, просто создайте другое отфильтрованное представление для того же базового представления, которое включает необходимые теги.

filtered  include "Element,Relationship" [key] [description]

Допустимые дочерние элементы:

  • default,

  • title,

  • description,

  • properties.

dynamic view

Ключевое слово определяет динамическое представление для указанной области.

dynamic <*|software system identifier|container identifier> [key] [description] {
    ...
}

Первое свойство определяет область видимости и то, что может быть добавлено к представлению:

  • пользователи и программные системы;

  • область внутри программной системы: пользователи, другие программные системы и контейнеры;

  • область применения контейнера: пользователи, другие программные системы, другие контейнеры и компоненты.

Ключ представления будет сгенерирован автоматически, если он не указан явно; автоматически сгенерированные ключи не гарантируют стабильности с течением времени, и информация о макете может быть потеряна при их использовании в сочетании со Structurizr Lite/локально/ облачно.

В отличие от других типов диаграмм, динамические представления создаются путем указания связей, которые должны быть добавлены к представлению в динамическом блоке, следующим образом:

 ->  [description] [technology]
 [description]

В динамическом представлении показаны экземпляры связей, которые определены в статической модели. Например, есть две программные системы, определенные в статической модели, с единственной связью между ними, описанной как «Отправляет данные». Динамическое представление позволяет переопределить описание взаимосвязи, чтобы лучше описать взаимодействие в контексте поведения, которое изображено на диаграмме.

Допустимые дочерние элементы:

  • autoLayout,

  • default,

  • title,

  • description,

  • properties.

deployment view

Ключевое слово определяет представление развертывания для указанной области и среды развертывания.

deployment <*|software system identifier>  [key] [description] {
    ...
}

Первое свойство определяет область представления, а второе свойство определяет среду развертывания (которая может быть идентификатором или именем). Комбинация этих двух свойств определяет, что может быть добавлено к представлению:

  • область применения: все узлы развертывания, узлы инфраструктуры и экземпляры контейнеров в среде развертывания;

  • область применения программной системы: все узлы развертывания и узлы инфраструктуры в среде развертывания; экземпляры контейнера в среде развертывания, принадлежащие программной системе.

Ключ представления будет сгенерирован автоматически, если он не указан явно; автоматически сгенерированные ключи не гарантируют стабильности с течением времени, и информация о макете может быть потеряна при их использовании в сочетании со Structurizr Lite/локально/ облачно.

Допустимые дочерние элементы:

  • include,

  • exclude,

  • autoLayout,

  • default,

  • animation,

  • title,

  • description,

  • properties.

custom view

Ключевое слово используется для определения пользовательского представления (доступно только в облачном сервисе Structurizr/локальной установке/Lite).

custom [key] [title] [description] {
    ...
}

Допустимые дочерние элементы:

  • include,

  • exclude,

  • autoLayout,

  • default,

  • animation,

  • title,

  • description,

  • properties.

image view

Ключевое слово используется для определения представления с изображениями (доступно только в облачном сервисе Structurizr/локальной установке/Lite).

image <*|element identifier> [key] {
    ...
}

Внутри блока можно указать источник изображения, используя один из вариантов:

  • plantuml ,

  • mermaid ,

  • kroki  (где format — идентификатор формата, включенный в URL-путь; например http://url/{формат}/…),

  • image .

При использовании этих сервисов нужно указать URL-адрес PlantUML/Mermaid/Kroki и формат: png или svg (необязательно). Эти данные могут быть указаны как свойства набора представлений:

views {
    properties {
        "plantuml.url" ""
        "plantuml.format" "svg"
        "mermaid.url" ""
        "mermaid.format" "svg"
        "kroki.url" ""
        "kroki.format" "svg"
    }
...

}

Ссылки PlantUML (https://plantuml.com/plantuml), Mermaid (https://mermaid.ink), и Kroki (https://kroki.io) могут работать, но при этом:

  1. Информация отправляется стороннему сервису.

  2. Общедоступные сторонние сервисы могут неправильно настроить заголовки CORS, необходимые для работы просмотров изображений.

Допустимые дочерние элементы:

  • default,

  • title,

  • description,

  • properties.

include

Ключевое слово используется для включения элементов или связей.

Включение элементов

Чтобы включить элементы в представление, используйте одну или несколько инструкций include внутри блока, определяющего представление.

include <*|identifier|expression> [*|identifier|expression...]

Элементы могут быть указаны либо с помощью индивидуальных идентификаторов, подстановочного знака (*), либо выражения свойства. Включение элементов также будет включать в себя отношения между этими элементами.

Идентификатор подстановочного знака (*) работает по-разному в зависимости от типа диаграммы:

  • представление системного ландшафта: включает всех пользователей и программные системы;

  • представление системного контекста: программная система, плюс все пользователи и программные системы, которые непосредственно подключены к данной программной системе;

  • представление контейнера: включает все контейнеры в рамках программной системы в области видимости; плюс пользователей и программные системы, которые непосредственно подключены к этим контейнерам;

  • представление компонентов: включает все компоненты внутри контейнера в области видимости; плюс пользователей, программные системы и контейнеры (принадлежащие программной системе в области видимости), непосредственно подключенные к ним;

  • Filtered view: неприменимо;

  • Dynamic view: неприменимо;

  • представление развертывания: включает в область действия все узлы развертывания, узлы инфраструктуры и экземпляры контейнеров, определенные в среде развертывания и (необязательно) программной системе.

Логика включения элементов по тегам:

  • element.tag==,[tag]: включает элементы, имеющие все указанные теги;

  • element.tag!=,[tag]: включает элементы, не имеющие все указанные теги.

Включение связей

Для включения связи в представление, нужно указать индивидуальный идентификатор связи или выражение:

include  [identifier|expression...]

Выражения связей работают только с элементами, которые существуют в представлении.

exclude

Ключевое слово используется для исключения элементов или связей.

Исключение элементов

Чтобы исключить определенные элементы, используйте одну или несколько инструкций exclude внутри блока, определяющего представление.

exclude  [identifier|expression...]

Исключение связей

Чтобы исключить связь в представлении, можно указать индивидуальный идентификатор связи или использовать выражение свойства:

exclude  [identifier|expression...]

Способы исключить отношения:

  • relationship.tag==,[tag] — исключить отношения, имеющие все указанные теги;

  • relationship.tag!=,[tag] — исключить отношения, не имеющие всех указанных тегов.

Как альтернативу можно использовать синтаксис выражения отношения следующим образом:

exclude "<*|identifier|expression> -> <*|identifier|expression>"

Комбинации параметров следующие:

  • → * — все связи между всеми элементами;

  • source → * — все связи от указанного элемента до любых элементов;

  • → destination — все связи от любых элементов до указанного элемента;

  • source → destination — все связи между указанными элементами.

Синтаксис выражения взаимосвязи работает только с элементами, существующими в представлении.

autoLayout

Включает режим автоматической компоновки диаграммы.

autoLayout [tb|bt|lr|rl] [rankSeparation] [nodeSeparation]

Первое свойство — направление ранжирования:

  • tb — сверху вниз (по умолчанию),

  • bt — снизу вверх,

  • lr — слева направо,

  • rl — справа налево.

Второе свойство — дистанция между рядами в пикселях (по умолчанию: 300); третье свойство — дистанция между узлами одного ряда в пикселях (по умолчанию: 300).

Если в рабочем пространстве DSL явно не определены представления, анализатор DSL автоматически создаст набор представлений по умолчанию с включенной автоматической компоновкой. Чтобы изменить такое поведение, можно (1) описать представления в явном виде, (2) использовать скрипт для отключения автоматической компоновки.

default

Устанавливает представление для отображения по умолчанию.

default

animation

Ключевое слово описывает анимацию для указанного представления. Каждый шаг анимации должен быть описан в отдельной строке внутри блока с указанием элементов, включенных в этот шаг.

animation {
     [identifier...]
     [identifier...]
}

title

Переопределяет заголовок представления.

title </code></pre>

<h2>styles</h2>

<p><strong>styles</strong> — блок для одного или нескольких стилей элементов/взаимосвязей, используемых при рендеринге диаграмм.</p>

<pre><code class="java">styles {
    ...
}</code></pre>

<p>Допустимые дочерние элементы: </p>

<ul><li><p>element, </p></li><li><p>relationship.</p></li></ul>

<h2>element style</h2>

<p>Ключевое слово используется для определения стиля элемента. Все вложенные свойства (форма, значок и так далее) являются необязательными.</p>

<pre><code class="java">element <tag> {
    shape <Box|RoundedBox|Circle|Ellipse|Hexagon|Cylinder|Pipe|Person|Robot|Folder|WebBrowser|MobileDevicePortrait|MobileDeviceLandscape|Component>
    icon <file|url>
    width <integer>
    height <integer>
    background <#rrggbb|color name>
    color <#rrggbb|color name>
    colour <#rrggbb|color name>
    stroke <#rrggbb|color name>
    strokeWidth <integer: 1-10>
    fontSize <integer>
    border <solid|dashed|dotted>
    opacity <integer: 0-100>
    metadata <true|false>
    description <true|false>
    properties {
        name value
    }
}</code></pre>

<p>Примечания: </p>

<ul><li><p>цвета указываются в виде шестнадцатеричного кода (например, #ffff00) или по наименованию цвета (например, yellow); </p></li><li><p>стили элементов предназначены для работы с облачным сервисом Structurizr/локальной установкой/Lite и могут не полностью поддерживаться форматами экспорта PlantUML, Mermaid и подобными.</p></li></ul>

<h2>relationship style</h2>

<p>Ключевое слово используется для определения стиля связи. Все вложенные свойства (толщина, цвет и так далее) являются необязательными.</p>

<pre><code class="java">relationship <tag> {
    thickness <integer>
    color <#rrggbb|color name>
    colour <#rrggbb|color name>
    style <solid|dashed|dotted>
    routing <Direct|Orthogonal|Curved>
    fontSize <integer>
    width <integer>
    position <integer: 0-100>
    opacity <integer: 0-100>
    properties {
        name value
    }
}</code></pre>

<p>Примечания: </p>

<ul><li><p>цвета указываются в виде шестнадцатеричного кода (например, #ffff00) или по наименованию цвета (например, yellow); </p></li><li><p>стили связей предназначены для работы с облачным сервисом Structurizr/локальной установкой/Lite и могут не полностью поддерживаться форматами экспорта PlantUML, Mermaid и подобными.</p></li></ul>

<h2>theme</h2>

<p>Ключевое слово используется для указания темы рендеринга диаграмм.</p>

<pre><code class="java">theme <default|url></code></pre>

<p>Значение <strong>default</strong> — это сокращение от https://static.structurizr.com/themes/default/theme.json, тема Structurizr по умолчанию.</p>

<h2>themes</h2>

<p>Ключевое слово используется для указания одной или нескольких тем рендеринга диаграмм.</p>

<pre><code class="java">themes <url> [url] ... [url]</code></pre>

<p>Значение <strong>default</strong> — это сокращение от https://static.structurizr.com/themes/default/theme.json, тема Structurizr по умолчанию.</p>

<h2>branding</h2>

<p>Ключевое слово позволяет определить некоторый пользовательский бренд, который следует использовать при отображении диаграмм и документации.</p>

<pre><code class="java">branding {
    logo <file|url>
    font <name> [url]
}</code></pre>

<h2>terminology</h2>

<p>Ключевое слово позволяет переопределить терминологию, используемую при визуализации диаграмм.</p>

<pre><code class="java">terminology {
    person <term>
    softwareSystem <term>
    container <term>
    component <term>
    deploymentNode <term>
    infrastructureNode <term>
    relationship <term>
}</code></pre>

<h2>configuration</h2>

<p>Внутри блока configuration указываются некоторые параметры.</p>

<pre><code class="java">configuration {
    ...
}</code></pre>

<p>Допустимые дочерние элементы: </p>

<ul><li><p>visibility, </p></li><li><p>users, </p></li><li><p>properties.</p></li></ul>

<h2>visibility</h2>

<p>Ключевое слово может быть использовано для настройки видимости рабочей области.</p>

<pre><code class="java">visibility <private|public></code></pre>

<h2>users</h2>

<p>Блок <strong>users</strong> может использоваться для указания пользователей, имеющих доступ к рабочей области для чтения или редактирования. Каждое имя пользователя (например, адрес электронной почты) и пара ролей должны быть указаны в отдельной строке. Допустимыми ролями являются <strong>read</strong> (только для чтения) и <strong>write</strong> (чтение-запись).</p>

<pre><code class="java">users {
    <username> <read|write>
}</code></pre>

<h2>! docs</h2>

<p>Ключевое слово используется для присоединения документации Markdown/AsciiDoc к родительскому контексту (рабочей области, программной системе или контейнеру).</p>

<pre><code class="java">!docs <path> [fully qualified class name]</code></pre>

<h2>! adrs</h2>

<p>Ключевое слово может используется для присоединения ADR Markdown/AsciiDoc к родительскому контексту (рабочей области, программной системе или контейнеру).</p>

<pre><code class="java">!adrs <path> [fully qualified class name]</code></pre>
    
            <p class="copyrights"><span class="source">© <a target="_blank" rel="nofollow" href="https://habr.com/ru/articles/786256/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=786256">Habrahabr.ru</a></span></p>
                    </div>
                                                    
            <br>
            <!--<div align="left">
                <script type="text/topadvert">
                load_event: page_load
                feed_id: 12105
                pattern_id: 8187
                tech_model:
                </script><script type="text/javascript" charset="utf-8" defer="defer" async="async" src="//loader.topadvert.ru/load.js"></script>
            </div>
            <br>-->

            <div style="padding-left: 20px;">
                <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2514821055276660"
                        crossorigin="anonymous"></script>
                <!-- PCNews 336x280 -->
                <ins class="adsbygoogle"
                     style="display:block"
                     data-ad-client="ca-pub-2514821055276660"
                     data-ad-slot="1200562049"
                     data-ad-format="auto"></ins>
                <script>
                    (adsbygoogle = window.adsbygoogle || []).push({});
                </script>
            </div>
            <!-- comments -->
                            <noindex>
                    <div style="margin: 25px;" id="disqus_thread"></div>
                    <script type="text/javascript">
                        var disqus_shortname = 'pcnewsru';
                        var disqus_identifier = '1364444';
                        var disqus_title = '[Перевод] Structurizr, описание, перевод (часть 2/3)';
                        var disqus_url = 'http://pcnews.ru/blogs/%5Bperevod%5D_structurizr_opisanie_perevod_cast_23-1364444.html';

                        (function() {
                            var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
                            dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
                            (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
                        })();
                    </script>
                    <!--<noscript>Please enable JavaScript to view the <a rel="nofollow" href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>-->
                    <!--<a href="http://disqus.com" rel="nofollow" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>-->
                </noindex>
            
        </div>

        <br class="clearer"/>
    </div>
    <br class="clearer"/>

    

        <div id="footer-2nd"></div>

        <div id="footer">
            <br/><br/>
            <ul class="horz-menu">
                <li class="about"><a href="/info/about.html" title="О проекте">О
                        проекте</a></li>
                <li class="additional-menu"><a href="/archive.html" title="Архив материалов">Архив</a>
                </li>
                <li class="additional-menu"><a href="/info/reklama.html"
                                               title="Реклама" class="menu-item"><strong>Реклама</strong></a>
                    <a href="/info/partners.html" title="Партнёры"
                       class="menu-item">Партнёры</a>
                    <a href="/info/legal.html" title="Правовая информация"
                       class="menu-item">Правовая информация</a>
                    <a href="/info/contacts.html" title="Контакты"
                       class="menu-item">Контакты</a>
                    <a href="/feedback.html" title="Обратная связь" class="menu-item">Обратная
                        связь</a></li>
                <li class="email"><a href="mailto:pcnews@pcnews.ru" title="Пишите нам на pcnews@pcnews.ru"><img
                                src="/media/i/email.gif" alt="e-mail"/></a></li>
                <li style="visibility: hidden">
                    <noindex>
                        <!-- Rating@Mail.ru counter -->
                        <script type="text/javascript">
                            var _tmr = window._tmr || (window._tmr = []);
                            _tmr.push({id: "93125", type: "pageView", start: (new Date()).getTime()});
                            (function (d, w, id) {
                                if (d.getElementById(id)) return;
                                var ts = d.createElement("script");
                                ts.type = "text/javascript";
                                ts.async = true;
                                ts.id = id;
                                ts.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//top-fwz1.mail.ru/js/code.js";
                                var f = function () {
                                    var s = d.getElementsByTagName("script")[0];
                                    s.parentNode.insertBefore(ts, s);
                                };
                                if (w.opera == "[object Opera]") {
                                    d.addEventListener("DOMContentLoaded", f, false);
                                } else {
                                    f();
                                }
                            })(document, window, "topmailru-code");
                        </script>
                        <noscript>
                            <div style="position:absolute;left:-10000px;">
                                <img src="//top-fwz1.mail.ru/counter?id=93125;js=na" style="border:0;" height="1"
                                     width="1" alt="Рейтинг@Mail.ru"/>
                            </div>
                        </noscript>
                        <!-- //Rating@Mail.ru counter -->

                    </noindex>
                </li>
            </ul>
        </div>

        <!--[if lte IE 7]>
        <iframe id="popup-iframe" frameborder="0" scrolling="no"></iframe>
        <![endif]-->
        <!--<div id="robot-image"><img class="rbimg" src="i/robot-img.png" alt="" width="182" height="305" /></div>-->
        <!--[if IE 6]>
        <script>DD_belatedPNG.fix('#robot-image, .rbimg');</script><![endif]-->

    </div>

<!--[if lte IE 7]>
<iframe id="ie-popup-iframe" frameborder="0" scrolling="no"></iframe>
<![endif]-->


    <div id="footer-adlinks"></div>

    
    
    
        <noindex>


            <!--LiveInternet counter--><script type="text/javascript">
                document.write("<a rel='nofollow' href='//www.liveinternet.ru/click' "+
                    "target=_blank><img src='//counter.yadro.ru/hit?t45.6;r"+
                    escape(document.referrer)+((typeof(screen)=="undefined")?"":
                        ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?
                            screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+
                    ";"+Math.random()+
                    "' alt='' title='LiveInternet' "+
                    "border='0' width='1' height='1'><\/a>")
            </script><!--/LiveInternet-->

            <!-- Rating@Mail.ru counter -->
            <script type="text/javascript">
                var _tmr = window._tmr || (window._tmr = []);
                _tmr.push({id: "93125", type: "pageView", start: (new Date()).getTime()});
                (function (d, w, id) {
                    if (d.getElementById(id)) return;
                    var ts = d.createElement("script"); ts.type = "text/javascript"; ts.async = true; ts.id = id;
                    ts.src = "https://top-fwz1.mail.ru/js/code.js";
                    var f = function () {var s = d.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ts, s);};
                    if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); }
                })(document, window, "topmailru-code");
            </script><noscript><div>
                    <img src="https://top-fwz1.mail.ru/counter?id=93125;js=na" style="border:0;position:absolute;left:-9999px;" alt="Top.Mail.Ru" />
                </div></noscript>
            <!-- //Rating@Mail.ru counter -->



            <!-- Yandex.Metrika counter -->
            <script type="text/javascript">
                (function (d, w, c) {
                    (w[c] = w[c] || []).push(function () {
                        try {
                            w.yaCounter23235610 = new Ya.Metrika({
                                id: 23235610,
                                clickmap: true,
                                trackLinks: true,
                                accurateTrackBounce: true,
                                webvisor: true,
                                trackHash: true
                            });
                        } catch (e) {
                        }
                    });

                    var n = d.getElementsByTagName("script")[0],
                        s = d.createElement("script"),
                        f = function () {
                            n.parentNode.insertBefore(s, n);
                        };
                    s.type = "text/javascript";
                    s.async = true;
                    s.src = "https://mc.yandex.ru/metrika/watch.js";

                    if (w.opera == "[object Opera]") {
                        d.addEventListener("DOMContentLoaded", f, false);
                    } else {
                        f();
                    }
                })(document, window, "yandex_metrika_callbacks");
            </script>
            <noscript>
                <div><img src="https://mc.yandex.ru/watch/23235610" style="position:absolute; left:-9999px;" alt=""/>
                </div>
            </noscript>
            <!-- /Yandex.Metrika counter -->

            <!-- Default Statcounter code for PCNews.ru http://pcnews.ru-->
            <script type="text/javascript">
                var sc_project=9446204;
                var sc_invisible=1;
                var sc_security="14d6509a";
            </script>
            <script type="text/javascript"
                    src="https://www.statcounter.com/counter/counter.js"
                    async></script>
            <!-- End of Statcounter Code -->

            <script>
                (function (i, s, o, g, r, a, m) {
                    i['GoogleAnalyticsObject'] = r;
                    i[r] = i[r] || function () {
                            (i[r].q = i[r].q || []).push(arguments)
                        }, i[r].l = 1 * new Date();
                    a = s.createElement(o),
                        m = s.getElementsByTagName(o)[0];
                    a.async = 1;
                    a.src = g;
                    m.parentNode.insertBefore(a, m)
                })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');

                ga('create', 'UA-46280051-1', 'pcnews.ru');
                ga('send', 'pageview');

            </script>

            <script async="async" src="/assets/uptolike.js?pid=49295"></script>

        </noindex>
    



<!--<div id="AdwolfBanner40x200_842695" ></div>-->
<!--AdWolf Asynchronous Code Start -->

<script type="text/javascript" src="https://pcnews.ru/js/blockAdblock.js"></script>

<script type="text/javascript" src="/assets/jquery.min.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/jquery/jquery.json.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/jquery/jquery.form.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/jquery/jquery.easing.1.2.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/jquery/effects.core.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/js/browser-sniff.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/js/scripts.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/js/pcnews-utils.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/js/pcnews-auth.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/js/pcnews-fiximg.js"></script>
<script type="text/javascript" src="/assets/a70a9c7f/js/pcnews-infobox.js"></script>
</body>
</html>