es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pregunta sobre Patrón de Diseño – Implementando el patrón DAO con Java Moderno.

Hemos heredado algún código en el que se implementa un patrón DAO de la siguiente manera:


interface DomainMapper<s, t=""> {
    T mapObjectModel(S source);
}

public abstract class AbstractDao<source, target=""> implements DomainMapper<source, target=""> {

    protected List<t> execute(SqlParameter params...) {
        // Ejecuta alguna consulta
        public S mapRow(ResultSet rs, int rowNum) {
            // Realiza el mapeo
            S source = super.mapRow(rs, rowNum);
            T value = mapObjectModel(s);
        }
    }
}

public class SpecificDAO extends AbstractDAO<source, target=""> {
    // Otras funciones
    public Target mapObjectModel(Source s) {
         // Implementación del mapeo aquí
    }
}

Tenemos alrededor de 20 DAO implementados de manera similar.

Aquí está la pregunta:

  1. Hay un DAO específico que necesita algún tipo de estado para persistir entre llamadas. Es decir, entre cada llamada a mapObjectModel() con la fuente, necesito almacenar algún valor que utilizaré en la siguiente llamada. Por ejemplo, imaginemos una relación Padre – Hijo, el mapObjectModel se llamará para cada hijo con el Padre y quiero crear un gráfico de objetos algo como esto:
public class Parent {
    private List<child> children;
}

Entonces, quiero crear un “contexto” al que pueda referirme en la siguiente llamada y obtener el Padre y agregarle hijos.

¿Cuál es la mejor y más fácil manera de actualizar mapObjectModel() para llevar información de estado entre llamadas y con cambios mínimos en los DAO existentes?

¿Existe un patrón que pueda resolver este problema por mí?

Gracias.

EDITAR:

Quiero poder guardar algún contexto entre cada llamada a mapObjectModel.

La base de datos devolverá algo como esto:


Padre Hijo


1 1


1 2


Lo que mi SpecificDAO debería devolver es un objeto de tipo Parent con una lista de hijos, por lo que cada vez que se llama a mapObjectModel con cada fila, quiero saber si ya tengo creado el objeto Parent, en cuyo caso puedo seguir añadiendo hijos.</source,></source,></source,></s,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una posible solución para agregar información de estado entre las llamadas a mapObjectModel() es introducir el patrón de Objeto de Contexto.

    El patrón de Objeto de Contexto implica crear un objeto que puede contener información de estado y pasarlo como parámetro a cada método que necesite acceder al estado. En este caso, podemos crear un objeto Context que contenga la información de estado que necesitamos para nuestro DAO específico.

    Aquí tienes un ejemplo de implementación:

    public class Context {
        private Parent parent;
    
        public Parent getParent() {
            return parent;
        }
    
        public void setParent(Parent parent) {
            this.parent = parent;
        }
    }
    
    public abstract class AbstractDao<source, target=""> implements DomainMapper<source, target=""> {
        // Agrega un parámetro de contexto a mapObjectModel
        public abstract T mapObjectModel(S source, Context context);
    
        protected List<t> execute(SqlParameter params..., Context context) {
            // ...
            S source = super.mapRow(rs, rowNum);
            // Pasa el parámetro de contexto a mapObjectModel
            T value = mapObjectModel(s, context);
            // ...
        }
    }
    
    public class SpecificDAO extends AbstractDAO<source, target=""> {
        // ...
        // Actualiza mapObjectModel para recibir un parámetro de Contexto
        public Target mapObjectModel(Source s, Context context) {
            // Verifica si ya tenemos un objeto Parent en el contexto
            Parent parent = context.getParent();
            if (parent == null) {
                // Si no existe, crea uno nuevo
                parent = new Parent();
                context.setParent(parent);
            }
            // Agrega el Child al objeto Parent
            Child child = // ... crea el objeto Child
            parent.getChildren().add(child);
    
            // Retorna el objeto Parent
            return parent;
        }
    }
    

    Con esta implementación, podemos crear un objeto Context antes de llamar a cualquiera de los métodos del DAO, y pasarlo a cada método. Cada llamada a mapObjectModel() puede entonces acceder a la información de estado en el objeto Context y actualizarlo en consecuencia.

    Agregar el parámetro de Context a execute() y mapRow() puede requerir una reestructuración del código existente del DAO, pero los cambios deberían ser mínimos. En general, esta implementación debería proporcionar una forma sencilla de persistir la información de estado entre las llamadas a mapObjectModel() sin modificaciones importantes al patrón de DAO existente.</source,></source,></source,>

Comments are closed.