web-dev-qa-db-ja.com

メソッド引数の自己健全性チェックはSRPに違反しますか?

私は基本的にリモートサーバーにログイン要求を送信するメソッドlogin()を持っています。無効なデータの処理にサーバーリソースを浪費したくないので、送信する前に入力の妥当性チェックを検討することにしました。

コードは次のようになります。

//Method to log user in
public void login(String username, String password) throws IOException{
    //If statement to sanity check credentials
    if (credentialsSanityCheck(username, password)) {
        //Perform login ...
    }
    else {
        throw new IllegalArgumentException("Invalid username/password");
    }
}

ただし、 単一の責任の原則 についてさらに学習した後、呼び出しコードから、またはメソッド自体の中でメソッドの引数をサニティチェックする方が適切であるかどうか疑問に思っています。私にとっては)データ検証がメソッドの責任に該当するかどうかを判断するため。

3
Garikai

アスペクトはSRP(セキュリティ、ロギングなど)の奇妙なカモです。多くの場合、真に有効なさまざまなビジネス上の理由で必要になりますが、多くの条件付きステップを押し込むように見えます(入力が安全な場合は、それを使用してログインし、奇妙なことが起こった場合はログに記録します)。

確かに、あなたがどれほど知識を持っているかに応じて、それはSRPに違反しています。しかし、言い換えれば、SRPは自殺協定ではありません。やや口当たりの良い構成では、条件付きの両方のボディが同じレベルの抽象化であることを確認します。

//Method to log user in
public void login(String username, String password) throws IOException{
   //If statement to sanity check credentials
   if (credentialsSanityCheck(username, password)) {
      loginWithSafedInput(username, password); // might fail due to user error, locked acct, etc... 
   }
   else {
      raiseUnsafeLogin(username, password); // audit trail and throws
  }
}

重要なのは、必要に応じて法医学的な証拠を使用して、安全にログインすることです。あなたが目を細めれば、それはSRP'yのようです。

7
Kristian H

ログイン機能には、安全にログインするか、拒否するという1つの責任があります。

「安全に」はその責任の一部です。それを発信者に任せることはできません。通話の外でチェックを行う場合、ログインはこれらのチェックを繰り返す必要があります。そうしないと、それ自体の責任は達成されません。

SRPは、最も誤解されている原則の1つです。コメントではこれを「公正な妥協」と呼んでいます。違う。 SRPはここではまったく適用されません。それについて学んだばかりの人がそうだと思うとき、それはしばしばまったく当てはまりません。

3
gnasher729