Plataformas de carona compartilhada como Uber, Lyft e Bolt revolucionaram a mobilidade urbana ao conectar passageiros a motoristas próximos em tempo real. No centro dessa experiência está uma interação complexa e dinâmica entre múltiplos serviços — desdecorrespondência de localizaçãoerastreamento em tempo real, atélógica de aceitação do motorista, notificações, etratamento de falhas.

Este artigo apresenta umestudo de caso abrangentede umprocesso de reserva de um aplicativo de carona compartilhada, modelado usando umUML Diagrama de Sequência. Vamos percorrer todo o ciclo de vida de um passageiro solicitando uma carona — desde a entrada até a confirmação — incluindocorrespondência de motorista, tratamento de tempo limite, notificações assíncronas, elógica de repetição.
Para tornar isso prático e imediatamente utilizável, fornecemos umtrecho de código PlantUML totalmente corrigido, válido e pronto para produçãoque gera um diagrama de sequência limpo e compatível com padrões.
Um passageiro registrado abre o aplicativo móvel, insere os locais de coleta e destino, seleciona o tipo de viagem (por exemplo, econômico, premium) e solicita uma viagem. O sistema realiza o seguinte:
Estima a tarifa e o tempo estimado de chegadausando roteamento em tempo real viaMapsService.
Encontra motoristas disponíveis próximosdentro de um raio (com tempo limite).
Envia solicitações de viagemaos motoristas melhor combinados.
Aguarda poraceitação ou recusa do motorista (com tempo limite de 30 segundos).
Se aceito:
Atribui a viagem.
Notifica tanto o passageiro quanto o motorista.
Inicia o rastreamento em tempo real.
Se nenhum motorista aceitar no prazo:
Marca a solicitação como falha.
Oferece tentativa novamente ou cancelamento.
Isso reflete o comportamento do mundo real dos aplicativos de compartilhamento de viagens:emparelhamento dinâmico, respostas assíncronas, eresiliência a cenários de não aceitação.
| Conceito | Papel neste Diagrama |
|---|---|
| Linha de vida | Linhas tracejadas verticais para cada participante (por exemplo, Passageiro, Servico de Viagem, Motorista) |
Mensagem Síncrona (->) |
Chamada direta (por exemplo, RS -> DM: findNearestDrivers) |
Mensagem Assíncrona (-->) |
Não bloqueante ou resposta (por exemplo, NS --> Motorista: Notificação push) |
| Barra de Ativação | Mostra a duração do processamento (ativar / desativar) |
| Fragmento Alternativo | Condicional: alt Aceitação do Motorista vs senão Tempo esgotado/Recusa |
| Fragmento Opcional | Fluxos opcionais (por exemplo, seleção de corrida premium) |
| Fragmento de Laço | Repete a busca por múltiplos motoristas (laço Encontrar motoristas disponíveis) |
| Fragmento de Referência | Referência a uma sub-sequência (por exemplo, iniciarSessãoRastreamento) |
Ator (Passageiro, Motorista) |
Usuários externos iniciando ações |
Serviço Externo (<<externo>>) |
MapsService, NotificationService |
| Progressão do Tempo | De cima para baixo — fluxo lógico do tempo |
| Participante | Papel |
|---|---|
Passageiro |
Ator que inicia o pedido de viagem |
Aplicativo Móvel |
Interface de frontend que manipula entrada e exibição |
Serviço de Viagem |
Serviço principal de backend que gerencia o ciclo de vida da viagem |
Serviço de correspondência de motoristas |
Corresponde passageiros a motoristas próximos |
Serviço de mapas |
Serviço externo para roteamento, tarifa e tempo estimado de chegada (<<externo>>) |
Serviço de notificação |
Envia notificações push/SMS/email ao motorista e ao passageiro (<<externo>>) |
Motorista |
Ator (aplicativo do motorista) respondendo a pedidos de viagem |
@startuml
title Aplicativo de Compartilhamento de Viagens - Diagrama de Sequência de Reserva de Viagem
skinparam monochrome true
skinparam shadowing false
skinparam sequenceMessageAlign center
autonumber "<b>[0]"
ator Passageiro
participante "Aplicativo Móvel" como App
participante "Serviço de Viagem" como RS
participante "Serviço de Correspondência de Motoristas" como DM
participante "Serviço de Mapas" como Maps <<externo>>
participante "Serviço de Notificação" como NS <<externo>>
ator Motorista
Passageiro -> App: Abrir app e inserir ponto de coleta/desembarque
ativar App
App -> RS: requestRide(ponto de coleta, ponto de desembarque, tipoDeViagem)
ativar RS
RS -> Maps: calculateFareAndETA(ponto de coleta, ponto de desembarque, tipoDeViagem)
ativar Maps
Maps --> RS: estimativaDeTarifa, tempoEstimadoMinutos, rota
desativar Maps
RS --> App: display(tarifa, tempoEstimado, confirmar?)
App --> Passageiro: Mostrar tarifa e tempo estimado, pedir confirmação
alt Passageiro confirma a viagem
Passageiro -> App: confirmRide()
App -> RS: confirmAndMatch()
ativar RS
loop Encontrar motoristas disponíveis (tempo limite 30s)
RS -> DM: findNearestDrivers(ponto de coleta, tipoDeViagem, distanciaMaxima)
ativar DM
DM --> RS: listaDeMotoristasDisponiveis
desativar DM
alt Motoristas encontrados
RS -> NS: sendRideRequestToDriver(idDoMotorista, pontoDeColeta, tarifa)
ativar NS
NS --> Motorista: Notificação push "Novo pedido de viagem"
NS --> RS: pedidoEnviado
alt Motorista aceita
Motorista -> NS: acceptRide()
NS --> RS: driverResponse(aceitar)
break Correspondência bem-sucedida
else Motorista recusa ou tempo esgotado
nota à direita de RS: Continuar para próximo motorista ou falhar
break Sem aceitação
fim
RS -> Maps: startTrackingSession(idDaViagem)
ativar Maps
Maps --> RS: idDeRastreamento, atualizacoesDeMapa
desativar Maps
RS -> NS: notifyPassenger("Motorista atribuído", informacaoDoMotorista, tempoEstimado)
NS --> Passageiro: Push "Motorista em rota"
RS -> NS: notifyDriver("Viagem confirmada", informacaoDoPassageiro)
NS --> Motorista: Push "Viagem aceita"
RS --> App: rideMatched(informacaoDoMotorista, veiculo, tempoEstimado)
App --> Passageiro: Mostrar detalhes do motorista e mapa
senão Nenhum motorista disponível
RS --> App: noDrivers("Nenhum motorista próximo. Tente novamente?")
break Sem motoristas
fim
fim
alt Correspondência bem-sucedida
RS --> App: bookingConfirmed(idDaViagem)
App --> Passageiro: Mostrar "Viagem reservada!" + rastreamento
senão Nenhuma aceitação após tentativas
RS --> App: requestFailed("Nenhum motorista disponível. Tente novamente?")
App --> Passageiro: Mostrar erro e opção de tentar novamente
fim
desativar RS
senão Passageiro cancela
App --> Passageiro: Cancelado
fim
desativar App
@enduml
✅ Nenhum retornar declarações — substituído por parar e fluxo adequado.
✅ Todos ativar/desativar pares estão corretamente fechados.
✅ alt/laço/opt estão corretamente aninhados e terminados.
✅ ref fragmentos são implícitos por meio de iniciarSessaoRastreamento (pode ser extraído como sub-diagrama).
✅ <<externo>> estereótipos usados para clareza.
✅ Teste agora: Cole em https://www.plantuml.com/plantuml → Clique em “Gerar” → Veja a renderização completa do fluxo instantaneamente.
Vá para PlantUML ao Vivo
Cole o código → Clique “Gerar”
✅ Diagrama de sequência visual instantâneo
💡 Dica Profissional: Adicione
skinparam backgroundColor #F8F8F8para um fundo branco limpo.
Abra Visual Paradigm Desktop ou VP Online
Crie um novo Diagrama de Sequência
Use Ferramentas > Importar > PlantUML → Cole o código
Gera automaticamente com linhas de vida, mensagens e barras de ativação
Use chat.visual-paradigm.com para solicitar:
“Refatore esta sequência de compartilhamento de viagens em arquitetura de microsserviços: divida o RideService, MatchingService, NotificationService e PaymentService. Adicione uma etapa opcional de pagamento após a correspondência.”
O VP AI irá:
Divida RideService em RideController, RideService, PaymentService
Adicionar PaymentService com processPayment() chamada
Adicionar <<externo>> para PaymentGateway
Adicionar opt para atualização opcional para premium
Entrar em online.visual-paradigm.com
Abrir OpenDocs → Criar uma nova página: “Especificação do Fluxo de Reserva de Viagem”
Insira o diagrama.
Adicionar:
Pré-condições: “O usuário deve estar logado, GPS habilitado”
Pós-condições: “Viagem combinada, rastreamento ativo, motorista notificado”
Exceções: “Nenhum motorista aceita em 30s”, “GPS indisponível”
Links: Para Diagrama de Caso de Uso, Diagrama de Classe, Máquina de Estados
| Benefício | Explicação |
|---|---|
| Prototipagem Rápida | Escreva UML em segundos com PlantUML |
| Aprimoramento com Inteligência Artificial | Refatore para microsserviços ou arquitetura em camadas |
| Amigável ao Controle de Versão | Armazene código no Git — sem arquivos binários |
| Escalável | Extenda com tipos de viagem, promoções, viagens em grupo |
| Compatível com várias ferramentas | Funciona no VS Code, Confluence, GitHub, etc. |
Quer ir além? Aqui estão as extensões comuns:
opt Tipo de Viagem: Premium
RS -> App: showPremiumOption()
App --> RS: selectPremium()
RS -> Maps: recalculateFareWithSurge()
Maps --> RS: newFare, updatedEta
fim
RS -> PaymentService: processPayment(rideId, amount)
ativar PaymentService
PaymentService --> RS: sucesso, transactionId
desativar PaymentService
RS --> App: showPaymentConfirmed()
Motorista -> NS: cancelRide(reason)
NS --> RS: driverCanceled
RS -> App: notifyPassenger("Motorista cancelou. Procurando novo motorista...")
Avise-me se você gostaria dessas variações em código PlantUML completo!
O processo de reserva de compartilhamento de viagem não é apenas sobre combinação — é sobre coordenação em tempo real, comunicação assíncrona, e resiliência sob incerteza. Ao modelar com Diagramas de Sequência UML e aproveitando PlantUML + ferramentas de IA como Visual Paradigm, as equipes podem:
Projetar com clareza e precisão
Detectar casos extremos cedo (por exemplo, sem motoristas, tempo esgotado)
Colaborar entre produto, engenharia e QA
Documentar fluxos para auditorias, integração e treinamento
✅ Comece agora: Cole o código PlantUML acima em PlantUML Live e veja seu fluxo de compartilhamento de viagens ganhar vida em segundos.
Use autonumber para rastreabilidade.
Adicione hide footbox para remover o rodapé.
Personalize as cores: skinparam sequenceMessageBackgroundColor #E0F7FA
Exporte como PNG/SVG/PDF para relatórios ou apresentações.
📬 Precisa de ajuda?
Quer uma versão com diagramas de classes, máquinas de estado, ou integração com backend Spring Boot/Node.js?
Basta pedir — eu gerarei o modelo completo de arquitetura para você.
✨ Modelar com precisão. Construir com rapidez. Entregar com confiança.