Eu tenho um projeto em que tenho duas classes que exigem um objeto de acesso ao banco de dados que atualiza a mesma tabela. As restrições da estrutura e do projeto fazem com que eu não possa combinar essas duas classes. Eu criei um caso abaixo que mostra como está a instalação. A classe A precisa ser capaz de atualizar e ler o registro, enquanto a classe B precisa ser capaz de atualizar e excluir o registro.
Se eu usar as classes como elas são, funciona muito bem, mas estou tendo um problema com o fato de que cada uma das classes exige uma funcionalidade que não está sendo usada para ser implementada. Por exemplo, para usar a classe A, preciso passar um dao que implemente a função de exclusão, mesmo que nunca seja chamada. Da mesma forma, eu tenho que passar para a classe B um dao que implementa a função de leitura, mas nunca será chamada.
Pensei em abordá-lo tendo interfaces que herdam outras pessoas (IReadDao, IUpdateDao, IDeleteDao sendo os daos que seriam herdados), mas essa abordagem basicamente requer uma interface diferente para cada combinação de funções (IUpdateAndRead, IReadAndDelete, IReadAndUpdate ... )
Eu quero usar uma interface para o dao porque não quero associar o aplicativo ao banco de dados. Existe um padrão ou método para realizar o que quero que alguém saiba? Desde já, obrigado.
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);
}
}
I
partir de SOLID
). Pode querer ler um pouco sobre isso.