Arquitetura empresarial
Separar operações da aplicação, regras do domínio e persistência, reconhecendo padrões e os seus custos.
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.
| Procura | Comportamento |
|---|---|
| Em curso | Termina, pede escrita, anuncia sucesso só se guardar. |
| Ausência confirmada | Erro de ausência, sem tocar a entidade. |
| Falha de acesso | Erro de armazenamento, nunca ausência. |
| Já terminada | Rejeita 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ão | Separa | Custa |
|---|---|---|
| Active Record | Registo com persistência no objeto. | Acopla ao armazenamento. |
| Data Mapper | Tradução em componente separado. | Mais peças para operações simples. |
| Repository | Coleção de entidades do domínio. | Consultas novas pedem operações com significado. |
| Unit of Work | Acompanha mudanças e coordena escrita. | Coordena o conjunto; sem atomicidade ou isolamento do armazenamento por si só. |
| Identity Map | Uma 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.