Arquitetura empresarial

Separar operações da aplicação, regras do domínio e persistência, reconhecendo padrões e os seus custos.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

A operação terminar partida

Para terminar a partida 7, a apresentação pede terminar(7) ao serviço; o serviço procura a partida, pede à entidade que termine, persiste o resultado e devolve os dados.

Apresentação --> TerminarPartida --> Partida
                             --> Partidas <-- PartidasSQL
                                          <-- PartidasMemoria

Camadas não tornam a operação atómica: falha entre alterar e guardar pede política de confirmação e repetição.

ProcuraComportamento
Em cursoTermina, pede escrita, anuncia sucesso só se guardar.
Ausência confirmadaErro de ausência, sem tocar a entidade.
Falha de acessoErro de armazenamento, nunca ausência.
Já terminadaRejeita sem nova escrita.

Onde ficam as regras

  • Transaction Script: procedimento com regras e escrita. Chega para operações simples; regras repetidas dispersam mudanças.
  • Domain Model: entidade com operações próprias. Partida.terminar() protege invariantes em vez de setters livres.
  • Service Layer: casos de uso como terminarPartida(id), coordena e pode delimitar transação. Não absorve invariantes da entidade.

O nome da classe não distingue Transaction Script de Domain Model: pergunta que componente protege cada regra.

Persistência e identidade

PadrãoSeparaCusta
Active RecordRegisto com persistência no objeto.Acopla ao armazenamento.
Data MapperTradução em componente separado.Mais peças para operações simples.
RepositoryColeção de entidades do domínio.Consultas novas pedem operações com significado.
Unit of WorkAcompanha mudanças e coordena escrita.Coordena o conjunto; sem atomicidade ou isolamento do armazenamento por si só.
Identity MapUma instância por identidade no âmbito.Âmbito global cresce sem limite; não é atomicidade.
interface Partidas {
    java.util.Optional<Partida> procurarPorId(long id);
    void guardar(Partida partida);
}

Optional.empty() é ausência após consulta válida, nunca falha escondida. Identidade por identificador não é igualdade de valores.

Fronteiras e testes

DTO leva campos à apresentação sem expor a entidade. Lazy Load adia leitura, mas cada linha pode disparar outra consulta (N+1).

Testa entidade e coordenação em separado; fake em memória para o serviço; integração real que escreve e relê para durabilidade. verify(guardar) prova o pedido, não a persistência.

Percurso completo do encerramento.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.