2012-02-03 3 views
1

私はfalseまたは整数を返すメソッドを呼びたいと思います。現時点では私のコードは次のとおりです。Java - 私のコントロールフローのより良いイディオム

int winningID = -1; 
if((ID = isThereAWinner()) != -1) { 
    // use the winner's ID 
} else { 
    // there's no winner, do something else 
} 

private int isThereAWinner() { 
    // if a winner is found 
    return winnersID; 
    // else 
    return -1; 
} 

、それは非常によく読まないように私はif((ID = isThereAWinner()) != -1)ビットが好きではありませんが、Cとは異なりますが、Javaの整数としてブール値を表現することはできません。これを行うより良い方法はありますか?

答えて

4

私はマットの答えのようなものを使用します。

class Result { 
    public static Result withWinner(int winner) { 
     return new Result(winner); 
    } 

    public static Result withoutWinner() { 
     return new Result(NO_WINNER); 
    } 

    private static final int NO_WINNER = -1; 

    private int winnerId; 

    private Result(int id) { 
     winnerId = id; 
    } 

    private int getWinnerId() { 
     return winnerId; 
    } 

    private boolean hasWinner() { 
     return winnerId != NO_WINNER; 
    } 
} 

このクラスは非表示になります勝者がまったくない場合の実際の表現方法の実装の詳細。

その後方法見つけ、あなたの勝者に:

private Result isThereAWinner() { 
    // if a winner is found 
    return Result.withWinner(winnersID); 
    // else 
    return Result.withoutWinner(); 
} 

そして、あなたの呼び出し方法で:

Result result = isThereAWinner(); 
if(result.hasWinner()) { 
    int id = result.getWinnerId(); 
} else { 
    // do something else 
} 

をそれは少し複雑すぎるように見えるかもしれないが、存在することになる場合には、このアプローチは、より柔軟性があります将来のその他の結果オプション。

+0

あなたの答えをありがとう。 Resultsクラスにもっと多くのデータを格納することができます(おそらく後で使用することができるフィニッシャの正確な順序など)。そして、あなたが言うように、それはデータを意味する多くの方法を持つことができます。乾杯。 – Joe

0

おそらく、あなたは、コーディングの妙技の理解に役立つ例外を検討することをお勧めします。

3

のようなものについてはどう:

private int getWinnerId() { 
    // return winner id or -1 
} 

private boolean isValidId(int id) { 
    return id != -1; // or whatever 
} 
int winnerId = getWinnerId(); 
if (isValidId(winnerId)) { 
    ... 
} else { 
    ... 
} 

これは、もちろん、すべての非常に主観的ですが、通常ははい/いいえ「の答え」を提供するisFoo方法を期待しています。

+0

ご回答ありがとうございます。私はそれが私のものよりもはるかに良いと思う。 – Joe

2

問題は、一度に2つの値を返そうとしていることです。あなたが取ったアプローチはこれにとって最も簡単です。より多くのオブジェクト指向やデザインパターンのアプローチが必要な場合は、リスナーパターンを使用します。

interface WinnerListener { 
    void onWinner(Int winnerId); 
    void noWinner(); 
} 

checkWinner(new WinnerListener() { 
    // handle either action 
}); 

private void checkWinner(WinnerListener wl) { 
    // if a winner is found 
    wl.onWinner(winnersID); 
    // else 
    wl.noWinner(); 
} 

このアプローチは、複数の引数や複数のさまざまなイベントなどの複雑なイベントでうまく機能します。例えばあなたは複数の勝者、または他のタイプのイベントを持つことができます。

+0

あなたの答えをありがとう。多分、私が欲しいものは過度のものですが、とても面白いです。乾杯。 – Joe

1

私は恐れていません。誤って(a == b)、if(a = b)と間違えてしまうのを避けるために、Javaはブール型と数値型の間の変換を取り除きます。たぶん、代わりに例外を試すことができますが、例外はいくらか面倒です。 (私の英語はあまり良くはありませんが、私はそれを明確にしたのだろうと思っています...)

0

整数の代わりに整数を使用し、-1ではなくnullを返します。この時点から見ていない:「私はない整数が、勝者のアイデンティティを表し、いくつかのオブジェクトを返していませ勝者 - なしインスタンス。」

0

ジョーもう一つの提案ですが、これは@Matと@bucに基づいて構成されています。これはもう少し前に述べましたが、これももちろん主観的です。クラス/ロジックの残りの部分はわかりません。コード/サンプルのコンテキスト内で意味がある場合は、異なるResultStatusを持つ列挙型を導入できます。

マットを使用して、isValidメソッドはブール値はいを返すことを期待述べたように/なし(一部はまた、読みやすさを訴える場合があります)

public enum ResultStatus { 
    WINNER, OTHER, UNLUCKY 
} 

これは、(同様にやり過ぎとあなたの残りのロジックに依存可能性がありと論理が拡大している場合)私は2つのセントにもかかわらずお勧めすると思った!したがって、パブリッククラス(@blocの提案に似ています)では、以下のようなメソッドを使用して、チェックされた結果のステータスを返すことができます。

public ResultStatus getResultStatus() { 
    if (isWinner()) { 
     return ResultStatus.WINNER; 
    } else { 
     return isOtherCheck() ? ResultStatus.OTHER : ResultStatus.UNLUCKY; 
    } 
} 
関連する問題