2010-09-15 26 views
2

est ici une méthode dans mon printemps/site web code Hibernate qui illustre mon code de base:Loi de Déméter et modèle DAO

public class UserVoteServiceImpl implements UserVoteService { 

    @Autowired UserRepository userRepository; 

    public static int getUserScore(long userId) { 
    return userRepository.findUserById(userId).getScore(); 
    } 
} 

Je crois que cette méthode est contraire à la loi de Déméter, puisqu'il fait appel à l'objet retourné par findUserById(). Comment puis-je changer ce code pour obéir au principe de la moindre connaissance?

Répondre

1

Je ne pense pas que ce soit une violation de la loi de Demeter. Ce serait une violation si vous passiez dans un objet, en supprimant userId et en utilisant uniquement l'ID utilisateur.

Voici un exemple qui serait une violation:

public class UserVoteServiceImpl implements UserVoteService { 

    @Autowired UserRepository userRepository; 

    public static int getUserScore(SomeWrapper someWrapper) { 
    return userRepository.findUserById(someWrapper.getUserId()).getScore(); 
    } 
} 

Mais il n'y a rien de mal à déléguer le travail au sein de la mise en œuvre de votre méthode, et il n'y a rien de mal à faire un appel sur l'objet retourné à partir du référentiel.

(Personnellement, je ne suis pas fou sur l'utilisation des services pour envelopper simples appels dao, mais c'est un autre problème.)

Je travaille actuellement sur une base de code perpétrée par des personnes qui, apparemment, jamais entendu parler de Lod, plein de choses comme

public Thing getThing(Integer id) { 
    return new Beta().getGamma().getDelta().getEpsilon().getOmega().getThing(id); 
} 

et initialement je pensais que votre exemple n'a pas atteint le même niveau de pathologie que cela. Mais après avoir lu this blog post, which is where I got the above example, of course, Je pense que je vous recommande de changer votre méthode pour

public class UserVoteServiceImpl implements UserVoteService { 

    @Autowired UserRepository userRepository; 

    public User getUser(Long userId) { 
    return userRepository.findUserById(userId); 
    } 
} 

et de laisser l'appelant tirer le score de l'utilisateur. Cette modification a également l'avantage d'avoir l'interface de service de l'application dans les objets de domaine, pas dans les primitives.