2

私のコードベースを例示するSpring/Hibernate Webサイトのコードのメソッドは次のとおりです。

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 に答える