Pessoal, estou tentando implementar o famoso DDD, mas surgiram algumas dúvidas, talvez devido ao fato de ter visto alguns exemplos mal elaborados e explicações vagas, mas enfim, vou tentar exemplificar.
Dividi o sistema nas seguintes camadas: Interface Usuário / Action / Service / Repositório
Para fazer simples CRUD’s tudo bem, não tive nenhuma dúvida, ficou assim:
1 - Exemplo simples!!!
[code]// crud básico
public class ClientAction {
public String saveClient() {
clientService.create(client);
return “saveClient”;
}
}
public class ClientService {
public void create(Client client) {
clientRepository.persist(client);
}
}
public class ClientRepository extends GenericRepository implements IClientRepository {
public void persist(Client client) {
entityManager.persist(client);
}
}
[/code]
Pois bem, ao chegar em problemas mais complexos, tive várias dúvidas, por exemplo:
1 - Existe algum padrão de nomenclatura? Tipo, para todos os casos de uso deve existir os métodos create(), delete(), retrieve() e update() em todas as camadas? Porque quando envolve regras de negócio e não CRUD, faz sentido o método “pedidoService.create(pedido)” (que é chamado pela Action) ter as regras de negócio dentro dele? Ou faz mais sentido chamar outro método, com outra nomenclatura, tipo “pedidoService.salvarPedidoVariasRegras(pedido)” e dentro desse método ser chamado “this.create(pedido)” ou até mesmo “pedidoRepository.create(pedido)”?
Acho que mostrando código fica mais fácil entender:
// Exemplo 1
public class PedidoAction {
public String savePedido() {
pedidoService.create(pedido);
return "savePedido";
}
}
public class PedidoService {
public void create(Pedido pedido) {
// regras
// regras
// regras
// regras
// regras
pedidoRepository.persist(pedido); // ou
}
}
// Exemplo 2
public class PedidoAction {
public String savePedido() {
// salvar pedidoes tem dezenas de regras
pedidoService.salvarPedidoVariasRegras(pedido);
return "savePedido";
}
}
public class PedidoService {
public void create(Pedido pedido) {
pedidoRepository.persist(pedido);
}
public void salvarPedidoVariasRegras(Pedido pedido) {
// regras
// regras
// regras
// regras
// regras
this.create(pedido);
}
}
2 - Uma classe PedidoService pode “conhecer” EmailService ou PedidoService deveria “conhecer” apenas EmailRepository? O que faz mais sentido?
Porque dependendo da entidade, Email por exemplo, não existe uma área para persisti-la, ou seja, não necessita das camadas Interface Usuário / Action / Service / Repositório, teoricamente apenas com Repository já conseguiria fazer o que preciso.
3 - Posso tratar regras simples na Action? Por exemplo:
[code]public class ClientAction {
public String deleteClient() {
if(client.getCards().isEmpty()) {
clientService.delete(client);
} else if (!client.getCards().isEmpty()) {
FacesMessages.instance().add("Não é possível excluir um Cliente que possua vínculo com Cartão.");
}
return "deleteClient";
}
}[/code]
É errado fazer isso? Ou deveria delegar a tarefa ao Service?
Valeu pessoal, abraços!!