O exemplo abaixo é totalmente artificial e seu único objetivo é transmitir meu ponto de vista.
Suponha que eu tenha uma tabela SQL:
CREATE TABLE rectangles (
width int,
height int
);
Classe de domínio:
public class Rectangle {
private int width;
private int height;
/* My business logic */
public int area() {
return width * height;
}
}
Agora, suponha que eu tenha um requisito para mostrar ao usuário a área total de todos os retângulos no banco de dados. Eu posso fazer isso buscando todas as linhas da tabela, transformando-as em objetos e iterando sobre elas. Mas isso parece estúpido, porque eu tenho muitos e muitos retângulos na minha mesa.
Então eu faço isso:
SELECT sum(r.width * r.height)
FROM rectangles r
Isso é fácil, rápido e utiliza os pontos fortes do banco de dados. No entanto, ele introduz uma lógica duplicada, porque também tenho o mesmo cálculo na minha classe de domínio.
Obviamente, neste exemplo, a duplicação da lógica não é fatal. No entanto, enfrento o mesmo problema com minhas outras classes de domínio, que são mais complexas.
fonte
Respostas:
Como o lxrec apontou, ele varia de base de código para base de código. Alguns aplicativos permitem que você coloque esse tipo de lógica de negócios em Funções e / ou consultas SQL e permitem que você execute essas sempre que precisar mostrar esses valores ao usuário.
Às vezes, pode parecer estúpido, mas é melhor codificar a correção do que o desempenho como objetivo principal.
Na sua amostra, se você estiver mostrando o valor da área para um usuário em um formulário da web, precisará:
É estúpido para coisas simples como a da amostra, mas pode ser necessário coisas mais complexas, como calcular a TIR de um investimento de um cliente em um sistema bancário.
Código de correção . Se o seu software estiver correto, mas lento, você terá chances de otimizar onde precisa (após a criação de perfil). Se isso significa manter parte da lógica de negócios no banco de dados, que assim seja. É por isso que temos técnicas de refatoração.
Se ficar lento ou não responder, você poderá ter algumas otimizações, como violar o princípio DRY, que não é pecado se você se envolver nos testes de unidade e de consistência adequados.
fonte
Você diz que o exemplo é artificial, então não sei se o que estou dizendo aqui se adequa à sua situação real, mas minha resposta é - use uma camada ORM (Mapeamento Relacional Objeto) para definir a estrutura e a consulta / manipulação de seu banco de dados. Dessa forma, você não tem lógica duplicada, pois tudo será definido nos modelos.
Por exemplo, usando a estrutura do Django (python), você definiria sua classe de domínio retangular como o seguinte modelo :
Para calcular a área total (sem filtragem), você definiria:
Como outros já mencionaram, você deve primeiro codificar a correção e otimizar apenas quando realmente atingir um gargalo. Portanto, se em uma data posterior você decidir, absolutamente precisa otimizar, poderá mudar para definir uma consulta bruta, como:
fonte
Eu escrevi um exemplo bobo para explicar uma ideia:
Então, se você tem alguma lógica:
Você pode reutilizá-lo nas classes de domínio:
Ou na sua camada de geração sql:
E, claro, você pode alterá-lo facilmente. Tente o seguinte:
fonte
Como o @Machado disse, a maneira mais fácil de fazer isso é evitá-lo e fazer todo o processamento no seu java principal. No entanto, ainda é possível ter que codificar a base com um código semelhante sem se repetir, gerando o código para ambos.
Por exemplo, usando o cog enable para gerar os três trechos de uma definição comum
snippet 1:
snippet 2:
snippet 3:
de um arquivo de referência
fonte