这是我的Spring / Hibernate网站代码中的一个方法,它代表了我的代码库:
public class UserVoteServiceImpl implements UserVoteService {
@Autowired UserRepository userRepository;
public static int getUserScore(long userId) {
return userRepository.findUserById(userId).getScore();
}
}
我认为这种方法违反了得墨忒耳法,因为它正在对findUserById()返回的对象进行调用。如何更改此代码以遵守最低知识原则?
答案 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);
}
}
让呼叫者从用户中取出分数。此更改还具有使应用程序的服务接口处理域对象而不是基元的好处。