得墨忒耳定律和DAO模式

时间:2010-09-15 17:21:44

标签: spring dao law-of-demeter

这是我的Spring / Hibernate网站代码中的一个方法,它代表了我的代码库:

public class UserVoteServiceImpl implements UserVoteService {

   @Autowired UserRepository userRepository;

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

我认为这种方法违反了得墨忒耳法,因为它正在对findUserById()返回的对象进行调用。如何更改此代码以遵守最低知识原则?

1 个答案:

答案 0 :(得分:1)

我认为这不违反得墨忒耳法。如果您传入某个对象,将userId从其中删除,并仅使用userid,那将是违规的。

这是一个违规的例子:

public class UserVoteServiceImpl implements UserVoteService {

   @Autowired UserRepository userRepository;

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

但是在方法的实现中委派工作没有任何问题,并且对从存储库返回的对象进行调用没有任何问题。

(我个人对使用服务来包装单个dao调用并不是很疯狂,但这是一个不同的问题。)

目前我正在开发一个代码库,这些代码库显然是那些从未听说过LoD的人,充满了像

这样的东西。
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);
   }
 }

让呼叫者从用户中取出分数。此更改还具有使应用程序的服务接口处理域对象而不是基元的好处。