2012-01-13 14 views
8

ログイン(ユーザー名とパスワード)に最低6文字が含まれているかどうかを確認する方法を作成しようとしています。ブーリアンのスイッチ/ケースリクエスト

このメソッドを作成したことを実現するにはpublic void checkLoginData(final String username, final String password)

  • ユーザ:真のパス:真
  • ユーザ:偽パス:真
  • ユーザその方法では、私は4つの異なるブール・チェーンを作成することができるもので、ブール値(ユーザーとPASS)を作成します:偽のパス:
  • 偽ユーザー:真のパス:偽

今、私はそれらのそれぞれのスイッ​​チ/ケース要求をしたいと思いますが、私はそれを実現する方法を得ることはありません...

なぜ私はスイッチが必要なのか尋ねれば、私はそれが必要だと思う。なぜなら、私はこれらの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}; 



} 

Thxを!

よろしくサファリ

+1

あなたはここで切り替える必要がありますか?あなたは何を達成したいですか? – Egor

+0

私はそれが何か異なることをするブールチェーンを必要としています。私はスイッチでこれをやりたいのですから。しかし、私はそれを働かせることはありません – safari

+1

2つのダブルの代わりに現在の状態を判断するために、それぞれのケースで列挙を使用することを検討してください。だから簡単にスイッチ/ケースを使うことができます。 – crusam

答えて

9

あなただけの整数型の上に、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

Uggh ...これは "セクシーなJava"と思う人は、学校に戻って行く必要があります。それが正しいことを慎重に読む必要があります...それは常に悪い兆候です。 –

+0

さて、これはスイッチで行う方法です。私は個人的にif/elseチェーンを使用して実装します –

+0

@StephenCそれはセクシーではないかもしれませんが、それを行うための高速かつ信頼できる方法です...与えられた、enumを使用することができましたが、これはさらに高速です。 – fge

3
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; 
    } 
} 
+0

ああ私の神。コードが足りません!単純すぎます! – 4ndrew

+0

@ safariあなたがたった4つの組み合わせを持っているなら、最初はうまいです。スイッチを使って同じことを試してみてください。 – Vaandu

+0

@ 4ndrew私は単に質問に答えました! – Vaandu

8

を基本的にこれよりも簡単な方法、および大幅に少ないラインをそれを行うための方法はありませんコードの

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

私の考えでは、これが最良の解決策です。

また、私はのtousandsにないセクシー-javaの-方法でこれを行うにはしたいと思い切り抜いた「IFSの

「セクシー-javaのウェイ」による場合は、あなたが「賢い」を意味しますか"あいまいな"場合、それを行うための他の方法があります。しかし、彼らは確かにコードを読みやすくする/保守しやすいものにしません。

ところで、上記の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}; 
    .... 
} 

注簡素化アクション( "例" ので、ここでは可能であることあなたの架空のスイッチで)簡単なブール代入にリファクタリングすることができ、テストは実際には互いに独立しています。私はあなたの上司だった場合、

真剣に);一般的に、あなたは...それを行う


...ですが、id私の上司を感動させることによりcelverを持っているとすることはできませんあなたはそのようなコードを書いた、私はUN-に感銘しました。あなたが不明瞭で維持できないコードを書いていると賢明だと思う上司は、無知です。私は列挙型とそれを解決する方法を

+0

はい私は以前これがまったく好きだったと知っていますが、IDは私の上司に感銘を受けるためにセルを持っているのが好きです。 Javaやアンドロイドのもの!とにかく! Thx男! +1。あなたの面白いコメントのために:P – safari

7

ゲスのthats:

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 
    { 

    } 
} 
+0

私はそれをもう一度やりました。とにかくあなたの助けのためのThx! – safari

11

あなたが本当に「セクシー-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の方法"、より "回避策"のように考えることができるかどうか確かでない)

+0

これも本当に素晴らしいようです! +1とthx! – safari

+0

私はビットマスクがより良い理由は理解していると思うが、私はこの方法がはるかに読みやすく、更新が容易だと思う。 – bigLarry

+0

私はあなたがしようとしていることを得ていますが、これは私の意見では反論のビットです。論理的な結論から文字列をキャストし、それを切り替えて、私が作業しているコードベースでコードの臭いになります。私は連続したif文をはるかに好むだろう。 –

関連する問題