Pular para o conteúdo

Elementos: as caixas

Uma caixa — um elemento — é uma pessoa, um sistema, um container, um componente ou uma classe. Tudo isso é a mesma estrutura no arquivo; o que diferencia é onde a caixa está na árvore e qual desenho ela pede.

A partir desta página vamos construir um modelo de reserva de salas de reunião, que cresce até o fim da seção Modelando.

model/reservas/elements.yaml
elements:
- id: reservas
name: Reserva de Salas
shape: system
description: Procura salas livres, confirma reservas e avisa quem participa.

Quatro campos, e só o id é obrigatório. Sem parent, essa caixa é raiz da árvore — portanto está no nível context, portanto é um sistema.

CampoObrigatórioO que faz
idsimo identificador dentro do projeto. Letras, números, ., -, _
namenãoo nome exibido. Sem ele, o próprio id aparece na caixa
shapenãoo desenho. Padrão: system
parentnãoa caixa que contém esta. É o que decide o nível C4
descriptionnãouma frase sobre o que ela faz, exibida na caixa
technologynãoa tecnologia, exibida na caixa em letra menor
tagsnãoetiquetas livres, para filtrar e agrupar
metanãopares chave/valor livres
levelnãoforça o nível. Discordar da árvore gera aviso, e a árvore vence
bindnãodeclara que esta caixa é o espelho de um elemento de outra modelagem

Esta é a regra que mais muda a forma de escrever. O nível C4 vem da profundidade na árvore de contenção, que o campo parent constrói:

sem parent → context (um sistema, ou uma pessoa)
filho de uma raiz → container
filho de um container → component
filho de um componente → code

Não existe um quinto nível: uma caixa mais funda que code continua sendo code. E não existe um campo “eu quero que esta seja um componente” — para descer um nível, dê um parent à caixa.

shape escolhe o desenho e a cor. Estas são as formas que vêm de fábrica:

shapeDesenhoUso típico
systemcaixaum sistema seu
externalcaixa de borda tracejada, cinzaum sistema de terceiro ou de outra equipe
actorsilhueta de pessoauma pessoa, ou um papel
botsilhueta de robôum agente automatizado tratado como ator
containercaixauma parte executável genérica
apicaixaum serviço com interface de programação
browserjanela de navegadoruma aplicação que roda no navegador
databasecilindroum banco de dados
queuefilauma fila de mensagens
topictópicoum tópico de eventos
componentcaixa menorum componente dentro de um container
classcaixa menoruma classe, no nível de código

Uma forma desconhecida não some do desenho: ela vira uma caixa neutra, e o cfour check avisa. Você pode criar formas próprias — veja Aparência da modelagem.

Para pôr containers dentro do sistema, basta dar a eles um parent:

model/reservas/containers.yaml
elements:
- id: painel
name: Painel de Reservas
shape: browser
parent: reservas
technology: React
description: Onde a pessoa procura uma sala livre e confirma a reserva.
- id: api
name: API de Reservas
shape: api
parent: reservas
technology: Node.js
description: Onde moram as regras — conflito de horario, limite e confirmacao.

Nada mais precisa mudar. As duas caixas agora são containers de reservas, e qualquer diagrama que abra reservas por dentro passa a mostrá-las.

Este é o arquivo completo depois de acrescentar a pessoa e o sistema de fora:

model/reservas/elements.yaml
elements:
- id: colaborador
name: Colaborador
shape: actor
description: Quem precisa de uma sala para a proxima reuniao.
- id: reservas
name: Reserva de Salas
shape: system
description: Procura salas livres, confirma reservas e avisa quem participa.
- id: agenda-corporativa
name: Agenda Corporativa
shape: external
technology: Google Workspace
description: Onde a empresa inteira ja mantem os compromissos das pessoas.
relations:
- from: colaborador
to: reservas
kind: sync
label: Procura e reserva
- from: reservas
to: agenda-corporativa
kind: sync
label: Cria o evento na agenda

Repare em agenda-corporativa: ela é external porque é um sistema de outra gente. Você não vai detalhar o que existe dentro dela, e o desenho tracejado diz isso a quem lê.

As caixas existem, mas ainda não conversam. Relações: as setas.