2010-09-15 2 views
2

Вот метод в коде моего Spring/сайта Hibernate, которая иллюстрирует мою кодовую:Закон Деметры и DAO шаблон

public class UserVoteServiceImpl implements UserVoteService { 

    @Autowired UserRepository userRepository; 

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

Я считаю, что этот метод нарушает закон Деметры, так как он делает вызовы на объекте возвращается findUserById(). Как я могу изменить этот код, чтобы подчиняться Принципу наименьшего знания?

ответ

1

Я не думаю, что это нарушение Закона Деметры. Это было бы нарушением, если бы вы проходили через какой-то объект, отключаясь от него и используя только идентификатор пользователя.

Вот пример того, что было бы нарушением:

public class UserVoteServiceImpl implements UserVoteService { 

    @Autowired UserRepository userRepository; 

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

Но нет ничего плохого в делегировании работы в рамках реализации данного метода, и нет ничего плохого сделать вызов на объект, возвращаемый из хранилища.

(Лично я не сумасшедший об использовании услуг завернуть одиночные вызовы дао, но это другая проблема.)

В настоящее время я работаю над кодовой совершаемыми людьми, которые, видимо, никогда не слышали о Лоде, полным таких как

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

и изначально я думал, что ваш пример не поднялся до такого же уровня патологии, как этот. Но после прочтения this blog post, which is where I got the above example, of course, Я думаю, что я бы порекомендовал вам изменить свой метод

public class UserVoteServiceImpl implements UserVoteService { 

    @Autowired UserRepository userRepository; 

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

и позволяя звонящий вытащить счет отключения пользователя. Это изменение также имеет преимущество использования интерфейса сервисов приложения в объектах домена, а не в примитивах.