Event Storming: uma ferramenta para modelagem de domínio

O que é Event Storming?

Definição de Event Storming

O Event Storming é uma técnica de modelagem de domínio que envolve a exploração colaborativa e o entendimento de um domínio específico de negócio.

Importância do Event Storming

Sua importância se dá pelo fato de que ele permite que as equipes entendam o fluxo de negócios, identifiquem problemas e descubram oportunidades de inovação.

Como funciona o Event Storming?

Passos básicos do Event Storming

A técnica envolve uma sessão de brainstorming, na qual os participantes mapeiam eventos, comandos e agregados em um espaço físico ou virtual.

Ferramentas usadas no Event Storming

Os participantes utilizam post-its de cores diferentes para representar diferentes elementos do domínio.

Event Storming e Domain-Driven Design

Como eles se complementam

O Event Storming se alinha perfeitamente com o Domain-Driven Design (DDD), pois ambos buscam entender a lógica de negócios.

Benefícios da integração

A combinação dessas duas técnicas pode resultar em uma compreensão mais profunda do domínio e na identificação de possíveis melhorias.

Aplicando Event Storming em negócios

Casos de uso

O Event Storming pode ser aplicado em diversas situações, como o desenvolvimento de novos produtos, a melhoria de processos existentes e a resolução de problemas de negócios.

Exemplos práticos

Por exemplo, em uma empresa de logística, o Event Storming pode ser usado para mapear e otimizar o fluxo de entrega de mercadorias.

Exemplo de implementação em C#

C#
using System;

// Definindo eventos relacionados à entrega de mercadorias
public enum Event
{
    MERCADORIA_ENTREGUE,
    MERCADORIA_PERDIDA,
    MERCADORIA_ATRASADA
}

// Definindo comandos relacionados à entrega de mercadorias
public enum Command
{
    INICIAR_ENTREGA,
    REGISTRAR_PERDA,
    REGISTRAR_ATRASO
}

// Definindo o agregado relacionado à entrega de mercadorias
public class DeliveryAggregate
{
    public string Status { get; private set; }

    public DeliveryAggregate()
    {
        Status = "pendente";
    }

    public void ApplyEvent(Event @event)
    {
        if (@event == Event.MERCADORIA_ENTREGUE)
            Status = "entregue";
        else if (@event == Event.MERCADORIA_PERDIDA)
            Status = "perdida";
        else if (@event == Event.MERCADORIA_ATRASADA)
            Status = "atrasada";
    }

    public void ProcessCommand(Command command)
    {
        if (command == Command.INICIAR_ENTREGA)
            ApplyEvent(Event.MERCADORIA_ENTREGUE);
        else if (command == Command.REGISTRAR_PERDA)
            ApplyEvent(Event.MERCADORIA_PERDIDA);
        else if (command == Command.REGISTRAR_ATRASO)
            ApplyEvent(Event.MERCADORIA_ATRASADA);
    }
}

// Exemplo de utilização do Event Storming
class Program
{
    static void Main(string[] args)
    {
        // Criando uma instância do agregado de entrega de mercadorias
        DeliveryAggregate delivery = new DeliveryAggregate();

        // Simulando eventos ocorridos no processo de entrega
        Event[] events = {
            Event.MERCADORIA_ENTREGUE,
            Event.MERCADORIA_ATRASADA,
            Event.MERCADORIA_PERDIDA
        };

        // Aplicando os eventos no agregado
        foreach (Event @event in events)
        {
            delivery.ApplyEvent(@event);
        }

        // Verificando o status final da entrega
        Console.WriteLine($"Status da entrega: {delivery.Status}");
    }
}

// Fonte: ChatGPT

Neste exemplo em C#, as enumerações Event e Command são usadas para representar os eventos e comandos relacionados à entrega de mercadorias. A classe DeliveryAggregate representa o estado da entrega e possui métodos para aplicar eventos e processar comandos. No método Main, simulamos uma série de eventos ocorridos no processo de entrega e, em seguida, exibimos o status final da entrega.

Exemplo de implementação em Java

Java
// Definindo eventos relacionados à entrega de mercadorias
enum Event {
    MERCADORIA_ENTREGUE,
    MERCADORIA_PERDIDA,
    MERCADORIA_ATRASADA
}

// Definindo comandos relacionados à entrega de mercadorias
enum Command {
    INICIAR_ENTREGA,
    REGISTRAR_PERDA,
    REGISTRAR_ATRASO
}

// Definindo o agregado relacionado à entrega de mercadorias
class DeliveryAggregate {
    private String status;

    public DeliveryAggregate() {
        status = "pendente";
    }

    public void applyEvent(Event event) {
        if (event == Event.MERCADORIA_ENTREGUE)
            status = "entregue";
        else if (event == Event.MERCADORIA_PERDIDA)
            status = "perdida";
        else if (event == Event.MERCADORIA_ATRASADA)
            status = "atrasada";
    }

    public void processCommand(Command command) {
        if (command == Command.INICIAR_ENTREGA)
            applyEvent(Event.MERCADORIA_ENTREGUE);
        else if (command == Command.REGISTRAR_PERDA)
            applyEvent(Event.MERCADORIA_PERDIDA);
        else if (command == Command.REGISTRAR_ATRASO)
            applyEvent(Event.MERCADORIA_ATRASADA);
    }

    public String getStatus() {
        return status;
    }
}

// Exemplo de utilização do Event Storming
public class Main {
    public static void main(String[] args) {
        // Criando uma instância do agregado de entrega de mercadorias
        DeliveryAggregate delivery = new DeliveryAggregate();

        // Simulando eventos ocorridos no processo de entrega
        Event[] events = {
                Event.MERCADORIA_ENTREGUE,
                Event.MERCADORIA_ATRASADA,
                Event.MERCADORIA_PERDIDA
        };

        // Aplicando os eventos no agregado
        for (Event event : events) {
            delivery.applyEvent(event);
        }

        // Verificando o status final da entrega
        System.out.println("Status da entrega: " + delivery.getStatus());
    }
}

//Fonte: ChatGPT

Neste exemplo em Java, as enumerações Event e Command são utilizadas para representar os eventos e comandos relacionados à entrega de mercadorias. A classe DeliveryAggregate representa o estado da entrega e possui métodos para aplicar eventos e processar comandos. No método main, simulamos uma série de eventos ocorridos no processo de entrega e, em seguida, exibimos o status final da entrega.

Exemplo de implementação em Python

Python
# Importando a biblioteca para manipulação de eventos
from enum import Enum

# Definindo eventos relacionados à entrega de mercadorias
class Event(Enum):
    MERCADORIA_ENTREGUE = 'mercadoria_entregue'
    MERCADORIA_PERDIDA = 'mercadoria_perdida'
    MERCADORIA_ATRASADA = 'mercadoria_atrasada'

# Definindo comandos relacionados à entrega de mercadorias
class Command(Enum):
    INICIAR_ENTREGA = 'iniciar_entrega'
    REGISTRAR_PERDA = 'registrar_perda'
    REGISTRAR_ATRASO = 'registrar_atraso'

# Definindo o agregado relacionado à entrega de mercadorias
class DeliveryAggregate:
    def __init__(self):
        self.status = 'pendente'
    
    def apply_event(self, event):
        if event == Event.MERCADORIA_ENTREGUE:
            self.status = 'entregue'
        elif event == Event.MERCADORIA_PERDIDA:
            self.status = 'perdida'
        elif event == Event.MERCADORIA_ATRASADA:
            self.status = 'atrasada'
    
    def process_command(self, command):
        if command == Command.INICIAR_ENTREGA:
            self.apply_event(Event.MERCADORIA_ENTREGUE)
        elif command == Command.REGISTRAR_PERDA:
            self.apply_event(Event.MERCADORIA_PERDIDA)
        elif command == Command.REGISTRAR_ATRASO:
            self.apply_event(Event.MERCADORIA_ATRASADA)

# Exemplo de utilização do Event Storming
def main():
    # Criando uma instância do agregado de entrega de mercadorias
    delivery = DeliveryAggregate()

    # Simulando eventos ocorridos no processo de entrega
    events = [
        Event.MERCADORIA_ENTREGUE,
        Event.MERCADORIA_ATRASADA,
        Event.MERCADORIA_PERDIDA
    ]

    # Aplicando os eventos no agregado
    for event in events:
        delivery.apply_event(event)

    # Verificando o status final da entrega
    print(f'Status da entrega: {delivery.status}')

if __name__ == '__main__':
    main()

# Fonte: ChatGPT

Neste exemplo, utilizamos enums (Event e Command) para representar os eventos e comandos relacionados à entrega de mercadorias. O agregado DeliveryAggregate representa o estado da entrega e contém métodos para aplicar eventos e processar comandos. No exemplo main(), simulamos uma série de eventos ocorridos no processo de entrega e, em seguida, verificamos o status final da entrega.

Os desafios do Event Storming

Dificuldades comuns

Alguns desafios podem surgir ao implementar o Event Storming, como a resistência da equipe e a complexidade do domínio.

Como superar esses desafios

O sucesso do Event Storming depende do envolvimento de todos os stakeholders e de uma liderança eficaz.

Por que as empresas deveriam adotar o Event Storming?

Vantagens competitivas

O Event Storming proporciona vantagens competitivas ao permitir uma compreensão mais profunda do negócio e a identificação de oportunidades de inovação.

Benefícios a longo prazo

Os benefícios a longo prazo incluem uma melhor colaboração entre as equipes, processos de negócios mais eficientes e produtos de maior qualidade.

Conclusão

O Event Storming é uma técnica poderosa que, quando bem aplicada, pode trazer insights valiosos sobre o domínio de negócio. Ele é mais do que uma ferramenta técnica; é uma maneira de conectar pessoas, ideias e negócios.

Esse conteúdo é parte do material disponibilizado para os participantes do meu grupo de estudos de DDD do Jeito Certo. Você quer participar desse grupo? Clique aqui e veja como funciona.

Elemar Júnior

Fundador e CEO da EximiaCo atua como tech trusted advisor ajudando empresas e pessoas a gerar mais resultados através da tecnologia.

Sessões de masterclass

Seja avisado de novos conteúdos

Gostou deste conteúdo? Então inscreva-se em nossa newsletter para receber notificações de novas publicações como essa:

Veja outros artigos relacionados

Revolucionando sistemas legados: Técnicas de modernização com o uso de DDD

É comum em empresas que existem há algum tempo ter sistemas legados que precisam ser modernizados. Muitas vezes, esses sistemas...

O Papel Crucial do Domain Expert no Desenvolvimento de Software

Em meio a um cenário de constante evolução tecnológica, o papel do Domain Expert, ou especialista do domínio, tem se...

Aplicando Domain-Driven Design (DDD) a um projeto real

O mundo da tecnologia está em constante evolução e, com ele, surgem novas estratégias e abordagens para enfrentar desafios crescentes....

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no curso de Event Storming: uma ferramenta para modelagem de domínio:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de DDD do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

× Precisa de ajuda?