El siguiente ejemplo es totalmente artificial y su único propósito es hacerme entender.
Supongamos que tengo una tabla SQL:
CREATE TABLE rectangles (
width int,
height int
);
Clase de dominio:
public class Rectangle {
private int width;
private int height;
/* My business logic */
public int area() {
return width * height;
}
}
Ahora suponga que tengo el requisito de mostrarle al usuario el área total de todos los rectángulos en la base de datos. Puedo hacer eso buscando todas las filas de la tabla, convirtiéndolas en objetos e iterando sobre ellas. Pero esto parece simplemente estúpido, porque tengo muchos rectángulos en mi mesa.
Entonces hago esto:
SELECT sum(r.width * r.height)
FROM rectangles r
Esto es fácil, rápido y utiliza las fortalezas de la base de datos. Sin embargo, introduce lógica duplicada, porque también tengo el mismo cálculo en mi clase de dominio.
Por supuesto, para este ejemplo, la duplicación de la lógica no es fatal en absoluto. Sin embargo, me enfrento al mismo problema con mis otras clases de dominio, que son más complejas.
fuente
Respuestas:
Como señaló lxrec, variará de una base de código a otra. Algunas aplicaciones le permitirán poner ese tipo de lógica de negocios en funciones y / o consultas SQL y le permitirán ejecutarlas en cualquier momento que necesite mostrar esos valores al usuario.
A veces puede parecer estúpido, pero es mejor codificar la corrección que el rendimiento como objetivo principal.
En su muestra, si muestra el valor del área para un usuario en un formulario web, tendría que:
Es estúpido para cosas simples como la de la muestra, pero puede ser necesario para cosas más complejas como calcular la TIR de una inversión de un cliente en un sistema bancario.
Código de corrección . Si su software es correcto, pero lento, tendrá la oportunidad de optimizar donde lo necesite (después de la creación de perfiles). Si eso significa mantener parte de la lógica empresarial en la base de datos, que así sea. Por eso tenemos técnicas de refactorización.
Si se vuelve lento o no responde, puede que tenga que hacer algunas optimizaciones, como violar el principio DRY, lo cual no es un pecado si se rodea de la prueba de unidad adecuada y la prueba de consistencia.
fuente
Usted dice que el ejemplo es artificial, por lo que no sé si lo que digo aquí se adapta a su situación real, pero mi respuesta es: use una capa ORM (mapeo relacional de objetos) para definir la estructura y la consulta / manipulación de su base de datos De esa manera no tiene lógica duplicada, ya que todo se definirá en los modelos.
Por ejemplo, utilizando el marco Django (python), definiría su clase de dominio rectangular como el siguiente modelo :
Para calcular el área total (sin ningún filtro) definiría:
Como otros han mencionado, primero debe codificar la corrección y solo optimizar cuando realmente llegue a un cuello de botella. Entonces, si en una fecha posterior decide, absolutamente tiene que optimizar, puede cambiar a definir una consulta sin procesar, como:
fuente
He escrito un ejemplo tonto para explicar una idea:
Entonces, si tienes algo de lógica:
Puede reutilizarlo en clases de dominio:
O en su capa de generación SQL:
Y, por supuesto, puedes cambiarlo fácilmente. Prueba esto:
fuente
Como dijo @Machado, la forma más fácil de hacerlo es evitarlo y hacer todo el procesamiento en su Java principal. Sin embargo, aún es posible tener que codificar la base con un código similar sin repetirlo generando el código para ambos.
Por ejemplo, usando cog enable para generar los tres fragmentos de una definición común
fragmento 1:
fragmento 2:
fragmento 3:
de un archivo de referencia
fuente