Padrões de Aplicações Empresariais
Estes são alguns dos padrões utilizados no desenvolvimento de aplicações empresariais. Mais padrões podem ser encontrados no catálogo oficial Patterns of Enterprise Applications, sendo que estes estão explicados a fundo no livro.
Domain Logic Patterns
Transaction Script
Organiza a lógica de domínio em transações, em que cada transação está associada a um request do utilizador e trata de uma única apresentação.
Domain Module
Organiza a lógica de domínio numa abordagem orientada a objetos. É caraterizada por objetos de domínio que incorporam tanto lógica de negócio como dados.
Service Layer
Define limites da aplicação através de uma camada de serviços, que define um conjunto de operações/serviços que o utilizador pode executar, coordenando as respostas da aplicação para cada um desses serviços.
Data Source Architectural Patterns
Table Data Gateway
Objeto que serve de gateway para uma tabela da base de dados. Cada instância deste objeto está responsável pela interação com todas as linhas dessa tabela.
Row Data Gateway
Objeto que serve de gateway para uma linha numa tabela da base de dados. Cada instância deste objeto está responsável pela interação com uma única linha da tabela.
Active Record
Objeto que encapsula uma linha de uma tabela da base the dados, adicionando lógica de domínio a esses dados.
Data Mapper
Uma camada de mappers que associa objetos de domínio com a base de dados, o que promove a independência entre a estrutura do objeto de domínio e a representação deste na base de dados.
Object-Relational Behavioral Patterns
Unit of Work
Mantém uma lista de objetos afetados por uma transação, para coordenar a escrita das alterações da transação e resolver problemas de concorrência.
Identity Map
Mapa de identidade que garante que cada objeto só é carregado uma vez. Quando tenta aceder ao objeto, verifica se não foi já carregado para o mapa.
Lazy Load
Objetos que não contém toda a informação necessária, mas sabem como ir buscar, maioritariamente para melhorar a eficiência e evitar carregar objetos de largas dimensões a menos que necessário.
Existem múltiplas abordagens:
- Lazy Initialization: verifica se campo é null quando acede, e se for null, carrega-o
- Virtual Proxy: proxy do objeto real que delega responsabilidade para o objeto real quando algum dos seus campos é acedido
- Value Holder: encapsula os campos do objeto real com métodos
- Ghost: objeto real num estado parcial, que carrega todos os campos quando acessado
Object-Relational Structural Patterns
Identity Field
Guardar o ID do objeto na base de dados como um dos seus campos, para manter uma identidade entre o objeto em memória e na base de dados.
Foreign Key Mapping
Associa objetos através de uma foreign key que referencia a outra tabela da associação.
Association Table Mapping
Associa objetos criando uma nova tabela que guarda conjuntos de foreign keys, em que cada uma referencia uma tabela da associação.
Single Table Inheritance
Representa uma hierarquia de herança com uma única tabela, com colunas para todos os campos de todas as subclasses. Alguns objetos poderão ter colunas a null, associadas aos campos que não fazem parte da sua classe concreta.
Class Table Inheritance
Representa uma hierarquia de herança com uma tabela para cada classe. Uma classe concreta pode resultar dos joins das tabelas das várias classes que a compõem.
Concrete Table Inheritance
Representa uma hierarquia de herança com uma tabela para cada classe concreta.
Web Presentation Patterns
Model-View-Controller (MVC)
Divide a interface de utilizador em 3 componentes com as suas responsabilidades, o modelo, a vista, e o controlador. A vista apresenta os dados ao utilizador. O controlador atualiza o modelo e entrega os dados à vista apropriada. O modelo contém os dados.
O utilizador pede uma vista a um controlador. O controlador interage com o modelo, e pede os dados. O modelo devolve os dados ao controlador. O controlador entrega os dados à vista. A vista apresenta os dados ao utilizador.
Front Controller
Um controlador que trata de todos os requests.
Existe um handler que trata de todo o comportamento comum e chama comandos através de uma interface command.
Existem comandos concretos, que definem comportamento específico e herdam da interface command. Cada um destes comandos concretos é chamado pelo handler, executa o seu comando concreto e escolhe a vista apropriada para ser apresentada.
Distribution Patterns
Remote Façade
Fornece uma coarse-grained interface em fine-grained objects para aumentar a eficiência através de uma rede. É mais eficiente ter menos chamadas remotas mais grosseiras e depois retirar a informação necessária dentro do processo final do que fazer múltiplas chamadas remotas finas.
Data Transfer Object (DTO)
Objeto serializável que serve para transferir dados entre processos de forma prática e eficiente. É um objeto de dados, não é o próprio objeto.