Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Melhor abordagem para regra de negócio

Olá pessoal!

Tenho uma dúvida com relação a melhor forma de tratar uma regra de negócio, para os que são mais experientes nisso.

Possuo uma entidade chamada EMPRESA, e outra PROJETO. Relacionamento OneToMany do lado de Empresa, ou seja, uma Empresa para muitos Projeto. No caso da CRUD da aplicação, o método DELETE "não deveria existir". Ao menos não de fácil acesso, caso qualquer usuário possa deletar uma empresa, e, com isso, todos os projetos (Cascade.type=ALL).

De qualquer maneira, a dúvida é a seguinte: tenho alguns xhtml que apresentam todos os projetos em uma DATATABLE, mas quero que o usuário possa "deletar" o projeto se quiser. Mas esse deletar deve simplesmente retirar o projeto da visualização dessa DATATABLE, e não deletá-lo do banco. Pensei em fazer da seguinte forma: criar um atributo Enum chamado "situação" para PROJETO, com os tipos "ATIVO" e "INATIVO", e alterar o método de listar os projetos da DAO, utilizando um CriteriaQuery filtrando somente os projetos cujo enum seja "ATIVO", e aí retornar a lista para o DATATABLE do xhtml. Penso que essa abordagem é mais segura que listar todos os resultados de PROJETO, e fazer um filtro pela DATATABLE, correto?

Qual a opinião de vocês?

5 respostas

Olá Felipe, tudo bem?

Sua abordagem me parece fazer bastante sentido para a situação apresentada.

Também gostei da abordagem.

Considerando que não é uma boa prática deixar regras de negócio na view (se fosse o caso de você colocar o filtro no datatable), o único custo que enxergo em colocar a regra somente na query, e que após a alteração você vai ter que refazer a query toda...

solução!

Achei interessante a ideia, mas já que na forma proposta a consultar terá que ser realizada no banco de dados novamente, e isso tem seu custo, deixarei uma alternativa:

Utilizando a API de Stream com Collections do Java 8, é possível fazer filtros facilmente em coleções, e remover um elemento pontualmente também é simples no Java 7 e anterior, então e se a sua lista de Projetos viesse de uma consulta no Banco, mas quando o usuário excluísse algum registro na DataTable, você apenas removeria este item na coleção no Controller, e mandaria de volta. Assim fica mais rápido do que com a abordagem de consultar de novo, e você não está tratando o negócio na view.

Se quiser, nem precisa ficar na Controller também, o método da Controller poderia delegar para um outro objeto, tipo um ProjetoBusiness, que seria uma camada intermediária entre seu Controller e o DAO, onde você trataria regras de negócio quando necessário.

Pois é, não descarto essa possibilidade. Mas não enxergo outra saída. Não quero que usuários possam remover livremente dados do banco. Até atualizar os valores considero um tanto quanto perigoso, mas... fazer o que hehe

Excelente, Emerson! Gostei bastante da sugestão. Não possuo tanto estudo na API de Stream do Java, tal que nem me veio a cabeça esta solução.

Era exatamente isto que estava atrás: uma solução que me fornecesse agilidade na manipulação desta dataTable pelo usuário.

Dessa forma poderei então retirar o objeto Projeto de uma collection que denomino prematuramente como "ativos" e inserir nos "inativos", que seriam aqueles deletados. Facilita até a consulta.

Grande abraço para todos e muito obrigado!