Tengo un proyecto donde tengo dos clases que requieren un objeto de acceso a la base de datos que actualiza la misma tabla. Las restricciones del marco y el proyecto hacen que no pueda combinar estas dos clases. He creado un caso a continuación que muestra cómo es la configuración. La clase A necesita poder actualizar y leer el registro, mientras que la clase B debe poder actualizar y eliminar el registro.
Si uso las clases como están, funciona bien, pero tengo un problema con el hecho de que cada una de las clases requiere una funcionalidad que no está utilizando para implementarse. Por ejemplo, para usar la clase A, tengo que pasarle un dao que implemente la función de eliminación, aunque nunca se llamará. Del mismo modo, tengo que pasar la clase B a un dao que implementa la función de lectura, pero nunca se llamará.
Pensé en abordarlo teniendo interfaces que hereden otros (IReadDao, IUpdateDao, IDeleteDao son los daos que se heredarían), pero este enfoque básicamente requeriría una interfaz diferente para cada combinación de funciones (IUpdateAndRead, IReadAndDelete, IReadAndUpdate ... )
Quiero usar una interfaz para el dao porque no quiero acoplar la aplicación con la base de datos. ¿Hay algún patrón o método para lograr lo que quiero que alguien sepa? Gracias por adelantado.
class IDao {
void update(ModelDao model);
void delete(String guid);
ModelDao read(String guid);
}
Class A {
private IDao dao;
public A(IDao dao) {
this.dao = dao;
}
public void doStuff() {
ModelDao model = new ModelDao();
...
dao.update(model);
}
public void readThenDoSomething(String id) {
ModelDao model = dao.read(id);
...
}
}
Class B {
private IDao dao;
public B(IDao dao) {
this.dao = dao;
}
public void makeUpdate() {
ModelDao model = new ModelDao();
...
dao.update(model);
}
public void delete(String id) {
dao.delete(id);
}
}
fuente
I
deSOLID
). Podría querer leer un poco sobre eso.