[quote=saoj]Por que vc diz que é gambiarra o código abaixo? (Pode até ser, a discussão é sobre isso mesmo)
usuário.pontua(outrousuario, nota);
// usuário
public class Usuario {
public void pontua ( Usuario outro, int nota){
usuarioDao.pontua(this.id, outro.id, nota);
}
}
Minhas opções são chamar o DAO diretamente na camada de serviço OU chamar o DAO indiretamente por dentro da entidade, o que vc diz ser gamb.
Atualmente eu faço a primeira, mas nesse tópico mesmo sugeriram a segunda porque fica mais OO.
[/quote]
Considerando que você não está falando de Repository (DDD), o problema em fazer o acesso direto ao DAO através de um Entity é que este não deve saber que, por uma limitação da tecnologia (memória), é necessário armazenar/recuperar os objetos em/a partir de um mecanismo de persistência como o banco de dados. É preciso lembrar que o banco de dados, idealmente, deve ser utilizado para suportar a persistencia de objetos, e não para complementar os dados que a sua aplicação usa e os objetos de domínio nem se quer tem conhecimento deles… um teste seria verificar quantos dados você armazena no banco que seus objetos do domínio não os conhecem.
Complementando com DDD, é por isso que o Repository, que deve ter um nome associado ao ubiquitous language, vem criar um certo tipo de indireção para dar a ilusão de que os objetos estão em algum ‘deposito’ de objetos em memória. A implementação do Repository, por sua vez, pode ser um DAO (diretamente, ou através de um strategy (GoF), por ex.). Nesse caso, um Entity, por ex., que é um dos responsáveis por expressar o modelo em DDD, poderia sim ter acesso ao repository para, por ex., buscar algo. Por isso, conceitualmente, Repository é bem diferente de DAO (as pessoas, normalmente, não querem saber de conceitos, e justificam que são iguais só porque a implementação é parecida… infelizmente).
[Editado:]
Como o Philip Calçado já disse algumas vezes aqui no fórum, embora seja possível um entity acessar o repository (= não viola DDD), normalmente o service costumar fazer isso. E, como já disse no inicio dessa thread, o service tem caracteristicas que facilitam bastante o acesso a um repository sem precisar tornar a aplicação muito complexa (ex. uso de AOP).