2

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

public class UserVoteServiceImpl implements UserVoteService {

   @Autowired UserRepository userRepository;

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

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

4

1 回答 1

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);
} 

最初我认为你的例子没有上升到与那个相同的病理学水平。但是在阅读了这篇博文之后,我得到了上面的例子,当然,我想我建议你将你的方法更改为

public class UserVoteServiceImpl implements UserVoteService {

   @Autowired UserRepository userRepository;

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

并让调用者将分数从用户身上拉下来。此更改还具有使应用程序的服务接口处理域对象而不是原语的好处。

于 2010-09-15T17:27:44.373 回答