Закон Деметры и модель DAO - PullRequest
2 голосов
/ 15 сентября 2010

Вот метод в коде моего сайта Spring / Hibernate, который иллюстрирует мою кодовую базу:

public class UserVoteServiceImpl implements UserVoteService {

   @Autowired UserRepository userRepository;

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

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

1 Ответ

1 голос
/ 15 сентября 2010

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

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

public class UserVoteServiceImpl implements UserVoteService {

   @Autowired UserRepository userRepository;

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

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

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

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

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

, и изначально я думал, что ваш пример не поднимется до того же уровня патологии, что и этот.Но после прочтения этого сообщения в блоге, где я и получил приведенный выше пример, конечно, , я думаю, что я бы порекомендовал вам изменить свой метод на

public class UserVoteServiceImpl implements UserVoteService {

   @Autowired UserRepository userRepository;

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

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

...