← Projetos

Tutorial

DFD Simulator: tutorial

Como desenhar diagramas de fluxo de dados e executá-los no navegador: do primeiro diagrama à leitura de filas e gargalos.

O que é o DFD Simulator

O DFD Simulator desenha diagramas de fluxo de dados e executa esses diagramas: você vê os dados percorrerem o sistema, formarem filas e serem gravados. [1] É um único arquivo HTML, que funciona no navegador, sem instalação nem conta.

Abrir o DFD Simulator

Tela inicial do DFD Simulator, com a paleta de elementos à esquerda, a área de desenho vazia com três exemplos e o painel de propriedades à direita
A tela inicial: arraste elementos para o diagrama ou abra um dos três exemplos.

Um diagrama parado mostra a estrutura, mas não mostra o que acontece quando o sistema recebe trabalho. Simular responde a perguntas como: para onde vai um pedido recusado, qual processo forma fila e o que muda ao dobrar a capacidade.

Como o app trata os seus dados

  • Nada sai do seu computador. O arquivo bloqueia conexões de rede.
  • O modelo fica no navegador. Ele é guardado automaticamente e reaparece ao reabrir o app. Para ter uma cópia própria, salve em JSON.
  • Modelos não executam código. As regras passam por um interpretador próprio, então abrir um modelo recebido de outra pessoa não roda JavaScript.

Os elementos de um DFD

Um DFD tem quatro elementos, e o app desenha cada um em duas notações. [3] [4] [5] Para a teoria, veja o tutorial de análise e projeto de sistemas. [2]

Os quatro elementos em duas notações. Em Yourdon e DeMarco, o processo é um círculo e o depósito tem duas linhas paralelas. Em Gane e Sarson, o processo é um retângulo arredondado, a entidade tem sombra e o depósito é um retângulo aberto. O fluxo é uma seta nas duas.
A notação é uma escolha de desenho e não muda a simulação.
Processo
Transforma dados. Tem nome com verbo, como “Validar pedido”, e um número.
Entidade externa
Algo fora do sistema, que envia ou recebe dados: cliente, banco, outro sistema.
Depósito de dados
Onde os dados ficam guardados entre um processo e outro. Tem número com a letra D.
Fluxo de dados
O caminho de um dado. A seta indica o sentido e o nome diz o que passa.

Todo fluxo precisa ter um processo em uma das pontas. Por isso, o app recusa ligar duas entidades, dois depósitos ou uma entidade a um depósito.

Seu primeiro DFD: uma pizzaria

Em cerca de 15 minutos, você vai construir e simular uma pizzaria. O cliente faz um pedido, o sistema calcula o valor, grava o pedido e avisa a cozinha.

1. Crie os elementos

  1. Se o app abrir com outro modelo, use Arquivo ▾ → Novo modelo.
  2. Arraste da paleta para o diagrama: Entidade externa à esquerda, Processo no centro, Depósito de dados acima do processo e outra Entidade externa à direita.
  3. Dê um duplo clique em cada elemento e renomeie, confirmando com Enter: Cliente, Registrar pedido, Pedidos e Cozinha.

2. Ligue os fluxos

Passe o mouse sobre um elemento: surgem pontos na borda. Arraste um ponto até o elemento de destino. O cursor vai para o campo Nome do novo fluxo; digite e pressione Tab.

  1. Cliente para Registrar pedido: pedido.
  2. Registrar pedido para Pedidos: pedido registrado.
  3. Registrar pedido para Cozinha: comanda.

3. Descreva o comportamento

Clique em um elemento e preencha o painel Propriedades, à direita.

  1. Em Cliente, preencha Dados gerados com as duas linhas abaixo, Emitir a cada com 2 e Limite de emissões com 5.
    id = seq
    qty = randint(1, 3)
  2. Em Registrar pedido, preencha Regras com a linha abaixo. Cada pizza custa 40.
    total = qty * 40
  3. Clique no fluxo comanda e preencha Campos que passam com id, qty. A cozinha não precisa ver o valor.
Diagrama da pizzaria com o processo Registrar pedido selecionado e o painel de propriedades mostrando regras, duração e capacidade
O processo selecionado e as suas propriedades. O diagrama já inclui o gerente, do passo 6.

4. Verifique o modelo

Abra a aba Verificar. Ela mostra um alerta: o depósito Pedidos recebe dados, mas ninguém os lê. Alertas não impedem a simulação; o passo 7 resolve este.

5. Simule

  1. Clique em ▶ Simular. Os dados saem do cliente e percorrem os fluxos.
  2. Ao terminar, o status mostra Concluída: nada mais agendado, perto de t = 11.
  3. Abra a aba Depósitos, no painel de baixo. Pedidos tem 5 registros, com id, qty e total.
  4. Clique em Cozinha. Em Último dado recebido aparecem só id e qty: o fluxo filtrou os campos.

6. Acrescente uma decisão

  1. Clique em ■ Editar para voltar ao desenho.
  2. Crie a entidade Gerente e ligue Registrar pedido a ela com o fluxo pedido grande.
  3. Nesse fluxo, preencha Condição com total >= 100. A linha fica tracejada, o que indica um fluxo condicional.
  4. Simule de novo. Gerente recebe 2 dos 5 pedidos, os de valor 120. Com a mesma semente, os valores se repetem.

7. Leia o depósito e resolva o alerta

  1. Volte a editar e crie a entidade Caixa e o processo Consultar pedido.
  2. Crie três fluxos: Caixa para Consultar pedido (consulta), Pedidos para Consultar pedido (dados do pedido) e Consultar pedido para Caixa (pedido consultado).
  3. Em Caixa, preencha Dados gerados com id = randint(1, 5) e deixe Emitir a cada em 0.
  4. No fluxo dados do pedido, preencha Filtro de leitura com id == in.id e Nome nas regras com order.
  5. Em Consultar pedido, preencha Regras com found = exists(order). A aba Verificar agora mostra Nenhum problema encontrado.
  6. Simule. Depois de Concluída, clique em Caixa: ela emite uma consulta, e Último dado recebido traz found: true.

Você usou emissão automática e manual, regras, condição, filtro de campos, gravação e leitura. O restante do tutorial detalha cada recurso.

A interface

A tela tem uma barra superior e três colunas: elementos à esquerda, diagrama no centro e propriedades à direita. Durante a simulação, surge um painel de resultados abaixo do diagrama.

Barra superior
Caminho dos níveis, desfazer e refazer, menu Arquivo ▾, ▶ Simular, idioma, ajuda e tema.
Elementos
A paleta. Arraste para o diagrama, ou clique para colocar no centro da vista.
Neste diagrama
Lista dos elementos e fluxos do nível aberto. Clicar seleciona o item.
Propriedades
Campos do item selecionado. Sem seleção, mostra Nome, Notação, Semente aleatória e Tempo máximo do modelo.
Verificar
Problemas do modelo. Clicar em um deles leva ao elemento.

Desenhar e organizar

ParaFaça
Criar um elementoArraste da paleta ou clique nela.
RenomearDuplo clique. Enter confirma e Esc cancela.
Criar um fluxoArraste um ponto da borda até o destino.
Curvar um fluxoSelecione o fluxo e arraste o ponto no meio dele. Endireitar desfaz.
Trocar as pontas de um fluxoUse os campos De e Para, ou Inverter sentido.
MoverArraste, com encaixe em uma grade de 8 pontos. Segure Alt para mover livremente.
Selecionar váriosArraste no fundo, ou clique com Shift.
Mover a vistaBotão do meio, ou Espaço + arrastar.
AproximarRoda do mouse. Ajustar enquadra o diagrama todo.
Trocar a notaçãoSem nada selecionado, use o campo Notação.

Dois fluxos entre os mesmos elementos se curvam sozinhos para não ficarem sobrepostos.

Propriedades de cada elemento

Processo

Regras
Calculam campos do dado. Veja a próxima seção.
Duração
Quanto tempo o processo leva. Aceita expressão, como random(1, 3).
Capacidade
Quantos dados atende ao mesmo tempo. O excedente espera na fila.
Limite da fila
Quantos dados podem esperar. Quem chega com a fila cheia é rejeitado. 0 é sem limite.
Prioridade
Expressão que escolhe o próximo da fila: o menor valor vai primeiro. Vazio segue a ordem de chegada.
Entradas
Executa a cada entrada atende cada dado que chega. Espera todas as entradas aguarda um dado de cada fluxo e combina os campos.
Intervalo automático
Para processos sem fluxo de dados de entrada: ele dispara sozinho nesse intervalo. Se lê depósitos, só dispara quando há registro, e o registro lido vira o dado.
Pausar a simulação aqui
Ponto de parada: pausa quando um dado chega. Só quando limita a uma condição, como total > 100. Depósitos e entidades também têm.

Entidade externa

Dados gerados
Os campos de cada emissão. seq é o número da emissão.
Emitir a cada
Intervalo entre emissões. Aceita expressão: exponential(2) gera chegadas irregulares, com média de 2. Com 0, a entidade só emite ao receber um clique durante a simulação.
Limite de emissões
Total de emissões automáticas. 0 é sem limite, e aí a simulação só para quando você pausar.
Primeira emissão em
Instante da primeira emissão automática.

Depósito de dados

Campo-chave
Identifica o registro em atualizações e exclusões.
Registros iniciais (JSON)
Lista de objetos carregada no início, como [{"id": 1, "stock": 10}].

Fluxo de dados

Os campos mudam conforme a origem e o destino do fluxo.

CampoAparece emFunção
CondiçãoFluxos que não leem depósitoO dado só passa se for verdadeira. Vazio é sempre; else vale quando nenhuma outra condição do processo for verdadeira.
Campos que passamFluxos que não leem depósitoLista separada por vírgulas. Vazio passa todos.
Operação de gravaçãoFluxos para depósitoInserir, Inserir ou atualizar pela chave ou Excluir pela chave.
Filtro de leituraFluxos vindos de depósitoEscolhe o registro. id == in.id compara o campo do registro com o dado de entrada. Vazio pega o primeiro.
Nome nas regrasFluxos vindos de depósitoComo as regras chamam o registro lido. Vazio usa o nome do depósito em minúsculas e sem acentos.
Ler todos os registrosFluxos vindos de depósitoO Nome nas regras vira uma lista com todos os registros que atendem ao filtro, para usar com count, sum e avg.
Remover o registro ao lerFluxos vindos de depósitoFaz o depósito funcionar como uma fila de trabalho.
Tempo de trânsitoTodosQuanto o dado leva para percorrer o fluxo.
Fluxo pedido aprovado selecionado no diagrama de pedidos, com a condição ok, a lista de campos e o tempo de trânsito no painel de propriedades
Um fluxo condicional é tracejado e mostra a condição entre colchetes.

Se mais de uma condição for verdadeira, cada fluxo recebe uma cópia do dado. Se nenhuma for verdadeira e não houver else, o dado é descartado e o registro mostra o motivo.

Regras e expressões

Regras têm uma atribuição por linha, no formato campo = expressão, e são aplicadas em ordem: uma linha pode usar o resultado da anterior. Linhas iniciadas com # ou // são comentários.

# preço vem do depósito lido
price = products.price
total = round(qty * price, 2)
ok = exists(products) && products.stock >= qty
TipoDisponível
Aritmética+ - * / %. + concatena se um dos lados for texto.
Comparação== != < <= > >=
Lógica&& || ! ou and or not, e condição ? a : b
Númerosround(x, casas), floor, ceil, abs, min, max, num
Aleatóriosrandom(a, b) decimal, randint(a, b) inteiro, exponential(média), normal(média, desvio), chance(p) e pick(a, b, c)
Listascount(l), sum(l, "campo"), avg, minof e maxof, para leituras de todos os registros
Textolen, upper, lower, concat, contains, str
Outrosexists(x), coalesce(a, b), if(condição, a, b)
OndeO que a expressão enxerga
Dados geradosseq, t e os campos das linhas anteriores
Regras e duraçãoCampos do dado, registros lidos pelo Nome nas regras e t
CondiçãoCampos do dado que sai do processo e t
Filtro de leituraCampos do registro, in.campo e t

Campo inexistente vale null, e ler um campo de null também dá null. Divisão por zero dá null. Quando a leitura não encontra registro, o nome dele vale null; por isso use exists.

Níveis e subdiagramas

Um processo complexo pode ser detalhado em outro diagrama, com numeração hierárquica: o processo 2 se abre em 2.1, 2.2 e assim por diante.

  1. Selecione o processo e clique em Detalhar em subdiagrama.
  2. Os fluxos do processo pai aparecem como elementos tracejados: à esquerda as entradas e à direita as saídas.
  3. Crie os processos internos e ligue-os a esses elementos.
Subdiagrama do processo Faturar pedido, com os processos 2.1 e 2.2 e os fluxos do nível superior como elementos tracejados
O subdiagrama de “Faturar pedido”, no exemplo de pedidos. O caminho no alto volta ao nível anterior.

Os níveis ficam balanceados porque os elementos tracejados vêm do pai. Um fluxo criado no pai surge no subdiagrama; um fluxo excluído no pai some, junto com as ligações. Para mudar o nome, edite o fluxo no pai.

  • Com subdiagrama, o processo pai perde regras e duração: a lógica passa a ser a dos processos internos.
  • O marcador ⊞ no processo abre o subdiagrama.
  • Remover subdiagrama apaga o nível e os que estiverem abaixo dele. Ctrl+Z desfaz.

Na simulação, o dado entra pelo elemento tracejado, passa pelos processos internos e sai pelo fluxo correspondente do pai. Ao ver o nível superior, um número azul no processo indica quantos dados estão dentro dele.

Verificar o modelo

A aba Verificar revisa o modelo inteiro, em todos os níveis, e o número nela mostra quantos problemas há. Só erros de ligação proibida, expressão e JSON impedem a simulação.

Aba Verificar mostrando o alerta de que o depósito Pedidos recebe dados, mas ninguém os lê
O alerta do passo 4 do roteiro.
ProblemaO que significaImpede simular
Ligação proibidaFluxo sem processo em uma das pontas.Sim
Expressão inválidaErro de sintaxe, ou função que não existe.Sim
Registros iniciais inválidosO texto não é uma lista JSON de objetos.Sim
MilagreProcesso sem entradas: produz dados do nada.Não
Buraco negroProcesso sem saídas: os dados somem nele.Não
Depósito só gravado ou só lidoNinguém lê o que entra, ou nada grava o que é lido.Não
Elemento isoladoNão está ligado a nada.Não
Sem nomeElemento ou fluxo sem nome. Fluxos de depósito e de subdiagrama podem ficar sem nome.Não
BalanceamentoFluxo do nível superior sem ligação no subdiagrama.Não
Falta campo-chaveAtualização ou exclusão em depósito sem chave.Não

Simular

▶ Simular executa uma cópia do modelo, em tempo simulado. Cada dado segue o ciclo abaixo:

Ciclo de um dado: a entidade emite; o dado percorre o fluxo; ao chegar a uma entidade é entregue, a um depósito é gravado e a um processo entra na fila; da fila vai para a execução, que lê depósitos, aplica regras e leva a duração; as condições de saída mandam uma cópia a cada fluxo verdadeiro, ou descartam o dado se nenhuma for verdadeira.
O caminho de um dado na simulação.

Controles

ControleTeclaFunção
▶ Executar / ⏸ PausarEspaçoInicia ou pausa o relógio.
VoltarBDesfaz o último evento. Dá para voltar e avançar quantas vezes quiser.
Linha do tempoA barra acima das abas leva a qualquer instante já simulado. Se você executar a partir dali, o trecho seguinte é refeito.
PassoNAvança até o próximo evento, para ver o que acontece em cada um.
ReiniciarRRecomeça do zero, com a mesma semente.
VelocidadeDe 0,25× a 8×. Não muda os resultados.
■ EditarEscVolta ao desenho e descarta a simulação.

O desenho fica bloqueado durante a simulação. Ainda é possível abrir subdiagramas e mover a vista, arrastando o fundo.

O que aparece no diagrama

Simulação em andamento no exemplo de gargalo: dados nos fluxos, fila acumulada no processo Atender, arco de progresso e registro de eventos abaixo
O exemplo de gargalo em execução, com um dado selecionado e a fila em “Atender”.
SinalSignificado
Círculo laranja no fluxoUm dado em trânsito. Clique para ver os campos e o caminho percorrido, que fica destacado no diagrama.
Círculo verde no fluxoUma leitura de depósito.
Arco em volta do processoProgresso da execução.
▤ 3Dados na fila do processo.
⋈ 1Dados esperando as outras entradas.
✓8Execuções concluídas.
2/3Atendimentos em andamento e capacidade.
↑5 ↓2Emitidos e recebidos pela entidade.
Número no canto do depósitoRegistros guardados.
×4Dados que já passaram pelo fluxo.
Faixa larga no fluxoVolume relativo: quanto mais larga, mais dados passaram.
94%Ocupação do processo até agora.
✕ 2Dados rejeitados por fila cheia.

Emitir e pausar

  • Entidade sem intervalo emite ao receber um clique. Em qualquer entidade, o botão Emitir agora das propriedades funciona.
  • Marque Pausar a simulação aqui em um elemento para parar quando um dado chegar a ele. O status mostra onde parou.
  • A simulação termina sozinha quando não há mais nada agendado.

Semente aleatória

random e randint seguem a Semente aleatória do modelo. Com a mesma semente, o resultado se repete, o que permite comparar cenários mudando uma coisa de cada vez. Troque a semente para ver outra sequência.

Cada elemento tem a sua própria sequência de sorteios, definida pela posição dele no diagrama. Assim, mudar a capacidade de um processo não altera as chegadas nem as durações dos outros.

Ler os resultados

O painel abaixo do diagrama tem seis abas, e cada uma responde a uma pergunta.

Registro
O que aconteceu e quando. Só problemas filtra descartes e erros, e Baixar CSV exporta. Clicar em uma linha leva ao elemento.
Estatísticas
Como o sistema se saiu e onde está o gargalo.
Filas
Como cada fila cresceu e diminuiu ao longo do tempo, em gráfico ou tabela.
Cenários
Quanto o resultado varia entre rodadas e o que mudou em relação a uma referência.
Depósitos
O que ficou gravado, em tabelas com até 200 registros cada.
Dados em trânsito
Onde está cada dado agora.
Aba Estatísticas com o resumo da simulação e a tabela de processos, em que Atender tem fila máxima alta e ocupação de 94 por cento
O resultado do exemplo de gargalo com capacidade 1.
Emitidos
Dados que entraram no sistema.
Entregues e Gravados
Chegadas a entidades e gravações em depósitos. Um dado pode gerar várias, porque cada fluxo recebe uma cópia.
Descartados
Dados sem condição verdadeira, ou parados em processo sem saída ou fluxo sem ligação no subdiagrama. O ideal é zero, salvo se for intencional.
Rejeitados
Dados recusados porque a fila estava cheia.
Tempo médio do início à entrega
Da emissão até a chegada a uma entidade.
Mediana e 95% entregues em até
Metade das entregas leva até a mediana, e 95% levam até o segundo valor. Mostram o que a média esconde.
Dados no sistema (média)
Quantos dados, em média, estavam circulando ou esperando.
Entregas por unidade de tempo
Total de entregas dividido pelo instante da última entrega.
Fila máx. e Espera média
Maior fila formada e tempo médio na fila.
Ocupação
Parte do tempo em que a capacidade esteve em uso.

Quando há fila, o resumo aponta o processo de maior ocupação entre os que formaram fila. É o primeiro candidato a gargalo.

Aba Filas com um gráfico de linha em degraus: a fila de Atender sobe até 13 perto de t = 25 e depois desce até zero
A fila de “Atender” com capacidade 1: cresce enquanto chegam chamados e só zera depois que eles param.
Aba Depósitos com as tabelas de registros do acervo e dos empréstimos no exemplo da biblioteca
Os depósitos ao final do exemplo da biblioteca.

Experimentos com os exemplos

Os três exemplos ficam em Arquivo ▾ e na tela inicial. Estes experimentos usam a semente 1, que é a padrão.

Encontrar um gargalo

Abra Gargalo de atendimento e simule: chega um chamado a cada 1 unidade de tempo, mas atender leva cerca de 2. A aba Filas mostra a fila subindo até 13. Uma rodada, porém, é só um sorteio. Para saber o que é regra e o que é acaso, repita.

  1. Abra a aba Cenários, deixe Rodadas em 30 e clique em Repetir com outras sementes.
  2. Clique em Guardar como referência.
  3. Clique em ■ Editar, selecione Atender, mude Capacidade para 2 e clique em ▶ Simular.
  4. Na aba Cenários, clique em Repetir com outras sementes de novo. A tabela compara os dois cenários.
Aba Cenários com a tabela de medidas, as colunas Atual, Menor e maior, Referência, Diferença e Leitura, comparando capacidade 2 com a referência de capacidade 1
Capacidade 2 comparada com a referência de capacidade 1, em 30 rodadas.
Média de 30 rodadas ± margemCapacidade 1Capacidade 2
Fila máxima em “Atender”12,7 ± 0,21,5 ± 0,2
Espera média em “Atender”12,23 ± 0,260,37 ± 0,05
Ocupação de “Atender”94%84%
Tempo médio do início à entrega17,63 ± 0,285,78 ± 0,06
95% entregues em até28,35 ± 0,426,42 ± 0,10
Fim da simulaçãot ≈ 54t ≈ 30

Dobrar a capacidade do gargalo reduziu a espera média de 12,23 para 0,37, e a coluna Leitura marca diferença clara, porque as margens não se sobrepõem. Quando elas se sobrepõem, a leitura é dentro da variação: o resultado não mostra que um cenário é melhor. Mudar a capacidade de Triagem não teria esse efeito, porque ela não forma fila.

Provocar uma atualização perdida

Abra Empréstimo de biblioteca. Com Emitir a cada em 4, são 5 empréstimos e o acervo cai de 5 exemplares para 0. Agora mude o valor em Leitor para 2 e simule: são 6 empréstimos de um acervo de apenas 5 exemplares.

A causa está nos tempos: uma solicitação lê o acervo antes de a anterior gravar a baixa. É uma atualização perdida, um problema clássico de concorrência. [6] O simulador não corrige isso; ele torna o problema visível.

Acompanhar um pedido por dois níveis

Abra Processamento de pedidos e simule: dos 8 pedidos, 7 são aprovados. Pausar e abrir Faturar pedido mostra os dados nos processos 2.1 e 2.2. Depois, em Gerência, use Emitir agora para consultar uma venda gravada.

Salvar, abrir e exportar

Opção de Arquivo ▾O que faz
Novo modeloComeça um modelo vazio, depois de pedir confirmação.
Abrir modelo (.json)…Carrega um modelo salvo. Também aceita arrastar o arquivo para a janela.
Salvar modelo (.json)Baixa o modelo, com todos os níveis. Atalho: Ctrl+S.
Exportar diagrama (SVG) ou (PNG)Baixa a imagem do nível aberto, em fundo branco.
Imprimir diagramaAbre a impressão do nível aberto.

Prompts de IA

Uma IA ajuda a levantar quem envia e recebe cada dado, a montar o primeiro diagrama, a escrever regras e a ler filas e gargalos. Ela também erra com segurança: inventa fluxos, chuta tempos e explica números que não leu. Trate a saída como rascunho de um colega apressado. Para escrever prompts melhores, veja o tutorial de prompts.

Seis passos: você descreve o sistema, a IA monta o rascunho, o app verifica e simula, o app repete as rodadas, a IA ajuda a ler os números e você decide a mudança. Da decisão, volta-se às rodadas para comparar com a referência.
A IA acelera o rascunho e a leitura. Os números vêm das rodadas no app, e a decisão é sua.

Antes de colar: diagramas e registros podem conter nomes, valores e regras sigilosas. Troque por dados fictícios e siga a política da sua organização para uso de IA. O app não envia nada para a rede, mas o serviço de IA recebe o que você colar nele.

Troque os trechos entre colchetes e cole na ferramenta de IA que você usa. Os prompts seguem a ordem do trabalho, mas cada um funciona sozinho.

1. Entrevistar antes de desenhar

Faz a IA descobrir o que falta, em vez de supor. É o melhor começo quando o sistema ainda está na cabeça das pessoas.

Você é um analista de sistemas experiente em diagramas de fluxo de dados.
Quero modelar este sistema: [descreva em poucas frases].

Antes de propor qualquer diagrama, me entreviste:
- Faça uma pergunta por vez e espere minha resposta.
- Cubra: quem envia e quem recebe dados de fora do sistema, o que cada dado contém, o que cada processo faz com ele, o que precisa ficar guardado, quem lê o que foi guardado, as condições que mudam o caminho, os erros e recusas, o volume de chegada e quanto tempo cada processo leva.
- Pergunte principalmente sobre o que dá errado, não só sobre o caminho feliz.
- Não invente respostas. Se eu não souber, registre como pendência.

Ao final, entregue tabelas de: entidades externas; processos (nome com verbo, entradas, saídas, regra, duração, capacidade); depósitos (campos e chave); fluxos (origem, destino, nome, campos, condição); e a lista de pendências.

2. Transformar um texto em elementos

Para requisitos, atas e procedimentos. Pede a origem de cada item, o que facilita conferir.

A partir do texto abaixo, extraia os elementos de um diagrama de fluxo de dados.

Texto:
[cole os requisitos, a ata ou o procedimento]

Entregue:
1. Entidades externas, processos e depósitos, cada um com o trecho do texto que o sustenta.
2. Fluxos: origem, destino, nome e campos. Todo fluxo precisa ter um processo em uma das pontas.
3. Regras e condições citadas, e em qual processo ou fluxo cada uma se aplica.
4. Lacunas: dados que aparecem sem origem, dados guardados que ninguém lê, processos sem entrada ou sem saída, e contradições.
5. Perguntas para esclarecer cada lacuna.

Não preencha lacunas por conta própria. O que não estiver no texto vai para as perguntas.

3. Gerar o modelo em JSON

Transforma o que você reuniu em um arquivo que o app abre, em vez de desenhar elemento por elemento. Gera só o nível principal; depois, detalhe no app os processos que precisarem.

Gere um modelo em JSON para o DFD Simulator, a partir das informações no fim.

Responda só com o JSON, sem comentários e sem cercas de código.

Formato:
- Raiz: "name", "notation" ("yd" ou "gs"), "seed" e "diagrams". Gere só "diagrams.root", com "id": "root", "parent": null, "nodes" e "flows". Não gere subdiagramas.
- Elemento: "id", "type" (entity, process ou store), "name", "x", "y" e, se fizer sentido, "desc".
- entity: "gen" (campos, um por linha, separados por \n; seq é o número da emissão), "interval" (número ou expressão, em texto; 0 só emite por clique), "limit" e "start".
- process: "k" (número único), "rules" (campo = expressão, um por linha), "duration" (expressão, em texto), "capacity" e "queueLimit" (0 é sem limite).
- store: "k" (número único), "key" (campo-chave) e "initial" (texto com uma lista JSON de objetos).
- Fluxo: "id", "from", "to", "name" e, conforme o caso:
  - saindo de processo: "guard" (condição; "else" vale quando nenhuma outra é verdadeira) e "fields" (campos que passam, separados por vírgula);
  - para depósito: "op" (insert, upsert ou delete);
  - vindo de depósito: "filter" (como id == in.id), "alias" (nome nas regras), "readAll" e "consume";
  - em qualquer um: "transit" (tempo de trânsito).

Regras:
- Todo elemento e todo fluxo precisa de "id". Todo fluxo precisa ter um processo em uma das pontas.
- Posições: x de 120 a 1300 e y de 70 a 600, com ao menos 240 de distância na horizontal e 150 na vertical. Entidades nas laterais, processos no centro e depósitos acima ou abaixo deles.
- Expressões aceitam + - * / %, comparações, and, or, not, condição ? a : b, round, floor, ceil, min, max, abs, exists, coalesce, if, count, sum, avg, random(a, b), randint(a, b), exponential(média), normal(média, desvio), chance(p) e pick(a, b). Use ponto no decimal. Não use outras funções.
- Uma condição não enxerga o registro lido: grave o resultado em um campo nas regras e use esse campo.
- Use os mesmos nomes de campo em todos os elementos, porque o app não avisa quando um nome está errado.
- Dê um "limit" maior que 0 às entidades com "interval", para a simulação terminar.
- Em "desc", diga se os tempos foram informados por mim ou são hipótese sua. Não invente fontes.

Exemplo do formato:
{
  "name": "Pizzaria",
  "notation": "yd",
  "seed": 1,
  "diagrams": {"root": {"id": "root", "parent": null,
    "nodes": [
      {"id": "c", "type": "entity", "name": "Cliente", "x": 120, "y": 240, "gen": "id = seq\nqty = randint(1, 3)", "interval": "3", "limit": 6},
      {"id": "p", "type": "process", "name": "Registrar pedido", "x": 400, "y": 240, "k": 1, "rules": "total = qty * 40", "duration": "2", "capacity": 1},
      {"id": "d", "type": "store", "name": "Pedidos", "x": 400, "y": 70, "k": 1, "key": "id"},
      {"id": "k", "type": "entity", "name": "Cozinha", "x": 680, "y": 240}
    ],
    "flows": [
      {"id": "f1", "from": "c", "to": "p", "name": "pedido"},
      {"id": "f2", "from": "p", "to": "d", "name": "pedido registrado"},
      {"id": "f3", "from": "p", "to": "k", "name": "comanda", "fields": "id, qty"}
    ]
  }}
}

Informações:
[cole o resultado do prompt 1 ou 2, ou descreva o sistema]

4. Estimar tempos e capacidades

Filas dependem de tempos. Este prompt deixa claro o que é hipótese e devolve expressões que o app aceita.

Preciso de tempos iniciais para simular este sistema. Não tenho medições.

Sistema:
[cole as tabelas ou o JSON do modelo]
Unidade de tempo: [escolha uma só para todo o modelo]

Para cada entidade e processo, entregue uma tabela com: mínimo, mais provável, máximo, em que você se baseou, como eu mediria o valor real e sua confiança (baixa, média ou alta).

Regras:
- Tudo é hipótese até eu confirmar. Diga isso claramente.
- Não cite estudos ou números de mercado que você não possa indicar com precisão. Sem base, diga "sem base" e dê só a faixa.
- Devolva o texto exato para os campos do app, usando só random(a, b), exponential(média) ou normal(média, desvio): Emitir a cada (entidade), Duração, Capacidade e Limite da fila (processo), Tempo de trânsito (fluxo).
- Para cada processo, compare o tempo que ele leva com o intervalo de chegada, considerando a capacidade, e aponte onde deve formar fila.
- Aponte as 3 estimativas que mais podem mudar o resultado e que eu deveria medir primeiro.

5. Revisar o diagrama

Procura o que a aba Verificar não vê: dados que saem de um processo sem nunca terem entrado, e fluxos que faltam.

Revise este diagrama de fluxo de dados como um analista de sistemas experiente.

Modelo:
[cole o JSON ou as tabelas]

Procure:
- Processos que produzem dados que não recebem: campos que saem sem entrar nem serem calculados.
- Dados recebidos que nenhum processo usa.
- Depósitos gravados que ninguém lê, ou lidos sem nada gravar, e leituras cujo filtro não acha o registro.
- Fluxos que faltam: erros, recusas, respostas à entidade de origem.
- Condições que deixam o dado sem saída, e fluxos sem else onde deveria haver um.
- Fluxos com nome vago, processos sem verbo e campos com nomes diferentes para o mesmo dado.
- Leituras e gravações do mesmo registro por processos simultâneos, que podem causar atualização perdida.

Entregue uma tabela com: elemento, problema, por que importa, sugestão e gravidade (alta, média ou baixa). Não reescreva o modelo. Não confirme que está certo só porque não achou problemas: diga o que não dá para avaliar sem mais dados.

6. Escrever regras e condições

Devolve o texto dos campos, respeitando o que cada um enxerga. Uma condição, por exemplo, não vê o registro lido.

Escreva regras e condições para o DFD Simulator.

Modelo:
[cole o JSON ou descreva os elementos e os campos]
O que preciso que aconteça:
[descreva em linguagem comum]

Para cada campo, entregue o texto exato e onde colar: Dados gerados (entidade), Regras e Duração (processo), Condição e Campos que passam (fluxo que sai do processo), Filtro de leitura e Nome nas regras (fluxo vindo de depósito).

Regras:
- Regras e dados gerados têm uma atribuição por linha, campo = expressão, e cada linha pode usar a anterior.
- Dados gerados enxergam seq, t e as linhas anteriores. Regras e duração enxergam os campos do dado, os registros lidos pelo Nome nas regras e t. Condição enxerga os campos do dado que sai e t. Filtro enxerga os campos do registro, in.campo e t.
- Uma condição não enxerga o registro lido: grave o resultado em um campo, como ok = exists(produto).
- Se mais de uma condição for verdadeira, cada fluxo recebe uma cópia. Se nenhuma for e não houver else, o dado é descartado: diga como tratar esse caso.
- Use só funções que existem: round, floor, ceil, abs, min, max, exists, coalesce, if, count, sum, avg, minof, maxof, len, upper, lower, concat, contains, random, randint, exponential, normal, chance e pick.
- Campo inexistente vale null, sem erro: confira os nomes e aponte os que você supôs.
- Dê um exemplo de dado de entrada e o resultado esperado, para eu conferir na simulação.

7. Ler os resultados da simulação

Depois de repetir as rodadas, copie as tabelas e cole no prompt, com o modelo.

Ajude-me a interpretar esta simulação. Os números vêm de um modelo, não de medições.

Modelo:
[cole o JSON ou descreva os elementos]
Resultados:
[cole as tabelas das abas Estatísticas e Cenários, informando quantas rodadas foram]

Entregue:
1. O que os resultados dizem, em até 5 frases, comparando média, mediana e 95%.
2. O provável gargalo, com fila máxima, espera média e ocupação, e por que os outros processos não são.
3. O que os descartados e rejeitados indicam.
4. O que é padrão e o que pode ser acaso: use a margem e a faixa entre menor e maior. Com uma rodada só, diga que ainda não dá para concluir.
5. O que eu não posso concluir: hipóteses frágeis e limitações do modelo.

Regras:
- Use só números que estão nas tabelas, sem criar novos. Se faltar um dado, diga que falta.
- Separe o que foi calculado da sua interpretação. Não afirme causas no mundo real: apresente como hipótese a confirmar.

8. Planejar os próximos cenários

Transforma o diagnóstico em uma lista curta de testes, para comparar com a referência uma mudança por vez.

Com base nesta simulação, planeje os próximos cenários.

Modelo:
[cole o JSON ou descreva os elementos]
Resultados:
[cole as tabelas das abas Estatísticas e Cenários]
Objetivo: [por exemplo, entregar 95% em até 10 unidades de tempo]
Restrições: [o que não pode mudar]

Proponha até 5 alternativas e, para cada uma, entregue:
- O que muda no modelo: o elemento, o campo (Capacidade, Duração, Limite da fila, Emitir a cada, Condição ou um fluxo novo) e o valor exato.
- O efeito esperado, como hipótese, e a medida que o confirmaria.
- O que seria preciso para fazer a mudança no mundo real, e o risco.

Regras:
- Cada alternativa muda uma coisa só, para o efeito ser atribuível.
- Comece pelo gargalo. Avise quando aliviar um processo pode só mover a fila para o seguinte.
- Não prometa ganhos em números: o resultado sai da simulação.

Termine com o passo a passo no app: repetir 30 rodadas, guardar como referência, voltar a editar, fazer a mudança, simular, repetir e ler a coluna Leitura. Inclua uma tabela vazia para eu preencher: alternativa, medida, referência, atual e leitura.

Como abrir o JSON gerado no prompt 3

  1. Copie a resposta da IA para um editor de texto e salve com a extensão .json, por exemplo sistema.json.
  2. No app, use Arquivo ▾ → Abrir modelo (.json)…, ou arraste o arquivo para a janela. Se já houver um modelo, confirme a substituição; salve antes o que quiser manter.
  3. Clique em Ajustar e arraste o que ficar mal posicionado: o app não organiza o diagrama sozinho.
  4. Abra a aba Verificar e confira cada item.

Como levar os resultados para a IA

O app não gera relatório da simulação. Para os prompts 7 e 8, selecione com o mouse a tabela da aba Estatísticas ou Cenários, copie e cole no prompt. Em Registro, Baixar CSV exporta os eventos.

SintomaCausaSolução
“Não foi possível abrir”, com erro de JSONA resposta tem texto ou as cercas ``` em volta do JSON.Salve só do primeiro { ao último }.
“o arquivo não é um modelo deste app”Falta diagrams.root.Peça para a IA corrigir conforme o formato do prompt.
Elementos amontoados em um pontoFaltam x e y.Arraste os elementos, ou peça as posições.
Faltam elementos ou fluxosO app ignora elementos e fluxos sem id, e fluxos com pontas que não existem. A aba Verificar costuma apontar o que sobrou.Compare com o JSON e peça a correção.
“liga entidade e depósito diretamente”, e a simulação não iniciaA IA ligou uma entidade direto a um depósito.Peça um processo entre os dois.
Contas dão 0 ou vazio, sem erroO nome do campo difere entre os elementos. Campo inexistente vale null, e o app não avisa.Clique em um dado em trânsito e confira os campos.
↑ Voltar ao topo

Atalhos de teclado

OndeTeclaAção
EdiçãoCtrl+Z / Ctrl+YDesfazer e refazer
EdiçãoCtrl+C / X / V / DCopiar, recortar, colar e duplicar
EdiçãoCtrl+ASelecionar todos os elementos
EdiçãoDelExcluir a seleção
EdiçãoSetas (com Shift, passo maior)Mover a seleção
EdiçãoCtrl+SSalvar o modelo
Edição? ou F1Abrir a ajuda
Edição e simulaçãoFAjustar a vista
SimulaçãoEspaçoExecutar ou pausar
SimulaçãoNAvançar um evento
SimulaçãoBVoltar um evento
SimulaçãoRReiniciar
SimulaçãoEscVoltar a editar

Limitações e solução de problemas

Limitações

  • Tempo sem unidade: uma unidade de tempo pode ser um segundo ou um dia, desde que todo o modelo use a mesma.
  • Margem de erro: a margem de 95% é uma aproximação, que supõe rodadas independentes. Use pelo menos 30 rodadas antes de tirar conclusões.
  • Depósitos sem transação: cada gravação é imediata, e duas leituras simultâneas enxergam o mesmo valor.
  • Copiar e colar: subdiagramas não são copiados.
  • Navegadores: o app foi testado no Chromium. O uso em outros navegadores e em celular não foi testado.

Problemas comuns

SintomaCausa provávelO que fazer
Simular não iniciaHá um erro que impede a execução.Abra Verificar e corrija os erros de ligação, expressão ou JSON.
Nada acontece ao simularNenhuma entidade tem intervalo.Clique em uma entidade, ou preencha Emitir a cada.
A simulação nunca terminaLimite de emissões está em 0.Defina um limite, preencha Tempo máximo no modelo ou pause quando quiser.
Dados descartadosNenhuma condição de saída foi verdadeira.Veja Só problemas e acrescente um fluxo com else.
Campo sempre vazioCampos que passam filtrou o campo em um fluxo anterior, ou o nome está diferente.Clique em um dado em trânsito e confira os campos.
Condição usando o registro lido não funcionaCondições não enxergam registros lidos.Grave o valor em um campo nas regras.
A leitura nunca encontra registroO filtro não usa in., ou nada foi gravado antes da leitura.Revise o filtro, como id == in.id, e olhe a aba Depósitos.
Atualizar ou excluir não muda o depósitoO depósito não tem Campo-chave, ou o dado não traz esse campo.Preencha a chave e confira Campos que passam.
Dados param em um processo com subdiagramaO fluxo do pai não está ligado no subdiagrama.Ligue o elemento tracejado a um processo interno.

Revisão rápida

Tente responder antes de abrir cada pergunta.

1. Por que o app recusa ligar um cliente direto a um depósito?

Porque todo fluxo precisa ter um processo em uma das pontas. Quem transforma e grava os dados é o processo.

2. Duas condições de saída são verdadeiras. O que acontece?

Cada fluxo recebe uma cópia do dado. Um fluxo com else só é usado quando nenhuma outra é verdadeira.

3. O que “Espera todas as entradas” faz?

Aguarda um dado de cada fluxo de entrada e combina os campos em um só antes de executar.

4. Como usar um registro lido em uma condição?

Grave o valor em um campo nas regras, como ok = exists(products), e use ok na condição.

5. Um fluxo foi criado no processo pai. O que muda no subdiagrama?

Surge um elemento tracejado com esse fluxo, e a aba Verificar aponta o balanceamento até ele ser ligado.

6. Por que a simulação repete os mesmos valores aleatórios?

Porque usa a mesma Semente aleatória. Isso permite comparar cenários; troque a semente para ver outra sequência.

7. A IA estimou os tempos e a aba Estatísticas apontou um gargalo. Ele está confirmado?

Não. O resultado segue os tempos informados. Confirme com dados reais, repita com outras sementes e compare a mudança com uma referência antes de agir.

↑ Voltar ao topo

Referências

  1. Giovani Perotto Mesquita, “DFD Simulator”, aplicativo em um único arquivo HTML, giovanipm.github.io/dfd-simulator.html.
  2. Giovani Perotto Mesquita, “Análise e projeto de sistemas”, tutorial deste site, giovanipm.github.io/AnaliseProjetoSistemas.html.
  3. Wikipedia (em inglês), “Data-flow diagram”, acesso em 30/10/2026, en.wikipedia.org/wiki/Data-flow_diagram.
  4. Tom DeMarco, Structured Analysis and System Specification, livro, Prentice-Hall, 1979, ISBN 978-0-13-854380-8.
  5. Chris Gane, Trish Sarson, Structured Systems Analysis: Tools and Techniques, livro, Prentice-Hall, 1979, ISBN 978-0-13-854547-5.
  6. Wikipedia (em inglês), “Concurrency control”, acesso em 30/10/2026, en.wikipedia.org/wiki/Concurrency_control.
↑ Voltar ao topo