web-dev-qa-db-ja.com

ブール値を使用したスイッチ/ケース要求

ログイン(ユーザー名とパスワード)に6文字以上あるかどうかを確認するメソッドを作成しようとしています。

このメソッドpublic void checkLoginData(final String username, final String password)を作成したことを理解しました。その方法では、ブール値(ユーザーとパス)を作成します。これらを使用して、4つの異なるブール値チェーンを作成できます。

  • ユーザー:trueパス:true
  • ユーザー:falseパス:true
  • ユーザー:falseパス:false
  • ユーザー:trueパス:false

次に、それぞれについてスイッチ/ケースのリクエストを行いたいのですが、それを理解する方法がわかりません...

なぜスイッチが必要なのかと聞かれた場合、私はそれが必要だと思います。4つのブールチェーンのすべてに対して、それが何か違うことをする/示すようにしたいからです。また、私はこれをセクシーなJavaの方法で行い、違いのある 'ifs'のtousandsを使わないようにします:P、助けてください!

メソッドのコードは次のとおりです。

public void checkLoginData(final String username, final String password){

    boolean user, pass;

    if (username.length() < 6){
        user = false;
    }else {
        user = true;
    }

    if (password.length() < 6){
        pass = false;
    }else {
        pass = true;
    }

    boolean[] logindaten = {user, pass};



}

事前の助けをありがとう!

よろしくサファリ

10
safari

切り替えできませんboolean[]、整数型のみ。ブール値をintに変換するには、たとえば次のように、2つのブール値にビットマスクを使用できます。

int val = 0;
if (user) val |= 0x1;
if (pass) val |= 0x2;

switch (val) {
case 0: // Both too short
case 1: // User Ok, pass too short
case 2: // User too short, pass ok
case 3: // Both Ok
}
9
king_nak

「セクシーなJavaの方法」が本当に必要な場合(ただし、それが理解できるかどうかによって異なります)、次のようなことができます(Java 7が必要です)。

boolean user, pass;

switch (user + "-" + pass) {
    case "false-false":
        ...
    case "false-true":
        ...
    case "true-false":
        ...
    case "true-true":
        ...
    default:
        throw new RuntimeException(
            "something strange happening here, user: " + user + ",pass: " + pass);
}

しかし、私はそれぞれが彼自身のメッセージを使用して2つの異なるチェックを行うことを望みます。メッセージはプレゼンテーションのために結合されます。 (それが「セクシーなJavaの方法」と考えられるかどうかはわかりませんが、「回避策」のようなものです)

11

基本的にこれより簡単な方法はなく、大幅に少ないコード行でそれを行う方法はありません。

if (username.length() < 6){
    if (password.length() < 6){
        // do case 1
    } else {
        // do case 2
    }
} else {
    if (password.length() < 6){
        // do case 3
    } else {
        // do case 4
    }
}

私の考えでは、これが最善の解決策になります。

また、私はこれをセクシーなJavaの方法でしたいのですが、多種多様な「ifs」ではありません

「sexy-Java-way」が「賢い」または「あいまい」を意味する場合は、他の方法があります。しかし、それらは確かにコードを読みやすくしたり、保守しやすくしたりするものではありません。

ちなみに、上記は3つだけです...そうです[〜#〜] three [〜#〜] ... ifステートメント。


ただし、(最終的な)特定の例:

public void checkLoginData(final String username, final String password){
    boolean user, pass;
    if (username.length() < 6){
        user = false;
    }else {
        user = true;
    }
    if (password.length() < 6){
        pass = false;
    }else {
        pass = true;
    }
    boolean[] logindaten = {user, pass};
    ....
}

次のように簡略化できます。

public void checkLoginData(final String username, final String password){
    boolean user = username.length() >= 6;
    boolean pass = password.length() >= 6;
    boolean[] logindaten = {user, pass};
    ....
}

アクション(仮想スイッチの「ケース」)を単純なブール割り当てにリファクタリングでき、テストが実際には互いに独立しているため、ここで簡略化が可能であることに注意してください。一般的にそれを行うことはできません...


...しかし、上司を感動させるためにそれをもっと好きにしたいです;)

真剣に、私があなたの上司で、あなたがそのようなコードを書いたなら、私はN-に感銘を受けるでしょう。あいまいで保守不可能なコードを書くことに利口だと思っている上司は誰も無知です。

8
Stephen C

それが列挙型でそれを解決する方法だと思います:

public class LoginController
{
  private void login( String username, String password )
  {
    LoginState state = determineLoginState( username, password );

    switch ( state )
    {
      case LOGIN_OK:
        //Do Something
        break;
      case USERNAME_FALSE:
        //Do Something
        break;
      case PASSWORD_FALSE:
        //Do Something
        break;
      case BOTH_FALSE:
        //Do Something
        break;
    }

  }

  private LoginState determineLoginState( String username, String password )
  {
    final boolean checkUsername = checkUsername( username );
    final boolean checkPassword = checkPassword( password );

    if ( checkUsername && checkPassword )
      return LoginState.LOGIN_OK;

    if ( !checkUsername && checkPassword )
      return LoginState.USERNAME_FALSE;

    if ( checkUsername && !checkPassword )
      return LoginState.PASSWORD_FALSE;

    if ( !checkUsername && !checkPassword )
      return LoginState.BOTH_FALSE;

    throw new AuthenticationException();
  }

  protected boolean checkUsername( String username )
  {
    return username.length() > 6;
  }

  protected boolean checkPassword( String password )
  {
    return password.length() > 6;
  }

  private enum LoginState
  {
    LOGIN_OK, USERNAME_FALSE, PASSWORD_FALSE, BOTH_FALSE;
  }

  public class AuthenticationException extends RuntimeException
  {

  }
}
8
crusam
if (user) {
    if (pass) {
        // user = true, pass = true
    } else {
        // user = true, pass = false
    }
} else {
    if (pass) {
        // user = false, pass = true
    } else {
        // user = false, pass = false
    }
}

または

int case = user ? (pass ? 1 : 2) : (pass ? 3: 4);

switch (case) {  
  case 1:
    System.out.println(" user = true, pass = true ");
    break;
  case 2:
    System.out.println(" user = true, pass = false ");
    break;
  case 3:
    System.out.println(" user = false, pass = true ");
    break;
  case 4:
    System.out.println(" user = false, pass = false ");
    break;
  }
}
3
Vaandu