6

以下に示すような複数の条件付きチェックを書く最も読みやすく/最善の方法は何でしょうか?私は(これはJavaのですが、言語は本当にここに重要ではありません)と考えることができ簡単な条件チェックを書く最もわかりやすい方法

2つの可能性:

オプション1:

boolean c1 = passwordField.getPassword().length > 0; 
    boolean c2 = !stationIDTextField.getText().trim().isEmpty(); 
    boolean c3 = !userNameTextField.getText().trim().isEmpty(); 

    if (c1 && c2 && c3) { 
     okButton.setEnabled(true); 
    } 

はオプション2:

if (passwordField.getPassword().length > 0 && 
     !stationIDTextField.getText().trim().isEmpty() && 
     !userNameTextField.getText().trim().isEmpty() { 
     okButton.setEnabled(true); 
    } 

私がオプション2について気に入らないのは、行が折り返されてからインデントが痛くなることです。私がオプション1について気に入らないのは、何も変数を作成せず、2つの場所を見る必要があるということです。

あなたはどう思いますか?任意オプションは?

+1

現代劇場には自動識別ツールがあるので、なぜボッターですか? – fbinder

答えて

26
if (HasPassword() && HasStation() && HasUserName()) 
    okButton.setEnabled(true); 


bool HasPassword() { 
return passwordField.getPassword().length > 0; 
} 

私はその方法を使用すると、条件文の叙述を作ることができることを見つけるので、私は、第二の方法が好き明らかです。つまり、その方法が適切に行われれば、実際にはそれが無関係であるかどうかにかかわらず、条件を "verablizing"することで、条件付きで分かりやすくすることができます。 「パスワードの長さがゼロよりも大きく、stationIDTextField(トリミング)が空ではなく、usernameTextField(トリミング)の場合:、2番目のオプションで、それはあなたの条件は、このようおおよそ変換することが明らかになっている

空ではない、そして...」

4

実際に意味を持つ変数名を使用するように、オプション1を変更します。つまり、 "c2"の名前を "stationIDIsEmpty"のように変更し(条件付きにNOTを移動する)。そうすれば、条件変数はすべての変数について前後に視線を合わせることなく読み込み可能です。

だから私のコードは、おそらく次のようになりますなど個人的に

1

boolean enteredPassword = passwordField.getPassword().length > 0; 
boolean stationIDIsEmpty = stationIDTextField.getText().trim().isEmpty(); 
boolean userNameIsEmpty = userNameTextField.getText().trim().isEmpty(); 

if (enteredPassword && !stationIDIsEmpty && !userNameIsEmpty) { 
    okButton.setEnabled(true); 
} 
1

私は次のことを好む:

このコーディングスタイルで
if (passwordField.getPassword().length > 0 
    && ! stationIDTextField.getText().trim().isEmpty() 
    && ! userNameTextField.getText().trim().isEmpty()) 
{ 
    okButton.setEnabled(true); 
} 

私は二つのことを達成:

  • を私は簡単に各余分なことがわかりますifの行は、開始時に& &(または||)のために条件の一部です。
  • 次の行の{が原因でif文がどこで終了するのかを簡単に確認できます。
1

オプション1は、リファクタリング 'Replace temp with Query'を適用するためのプライムです。なぜなら、誰かが変数の間でコードに詰め込むことができ、コードの動作をチェックして変更するからです。または、古い値でチェックが行われる可能性があります。初期化とチェックの間にテキストフィールドが更新されました。

だから、これで私の試みは

if (GetPasswordLength() > 0 
    && FieldHelper.IsNotEmpty(stationIDTextField) 
    && FieldHelper.IsNotEmpty(userNameTextField) 
{ 
    okButton.setEnabled(true); 
} 

FieldHelperはpublic staticメソッドを持つクラスである(また、C#で静的クラス/ユーティリティクラスと呼ばれる)オプション1は、のために許可していないことを

6

注だろう短絡動作。つまり、最初の結果を評価する前に、すべての条件式の値を計算します。

3

私はChris Brandsmaの答えに投票しました。

しかし、ちょうど私がオプション1で持っている主な問題について言及したかったのは、& &の恩恵を失っているということです。オプション1では、読めるとは思うが、必要ないかもしれないときに比較処理をしている。

+1

http://en.wikipedia.org/wiki/Short-circuit_evaluationを参照してください。 –