6

以下に示すような複数の条件付きチェックを作成するための最も読みやすい/最良の方法は何でしょうか?

私が考えることができる2つの可能性(これはJavaですが、言語はここでは実際には重要ではありません):

オプション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つの場所を調べる必要があることです。

それで、あなたはどう思いますか?他オプションはありますか?

4

7 に答える 7

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


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

于 2009-04-28T17:05:15.760 に答える
6

オプション1では短絡動作が許可されていないことに注意してください。つまり、最初の結果を評価する前に、すべての条件の値を計算します。

于 2009-04-28T17:09:12.050 に答える
4

オプション1を変更して、実際に意味のある変数名を使用するようにします。つまり、「c2」の名前を「stationIDIsEmpty」のような名前に変更します(そしてNOTを条件付きに移動します)。そうすれば、すべての変数を前後に一瞥することなく、条件を読み取ることができます。

したがって、私のコードはおそらく次のようになります。

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);
}
于 2009-04-28T17:03:24.670 に答える
3

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

しかし、オプション1で私が抱えている主な問題は、&&のメリットを失っているということです。オプション1を使用すると、読みやすくなると思いますが、必要がない場合は比較を処理しています。

于 2009-04-28T17:09:43.360 に答える
1

個人的には、2番目の方法が好きです。なぜなら、その方法を使用すると、条件の予測が明確になるためです。つまり、その方法が適切に行われると、それを「言語化」することによって条件を理解できるようにすることができます(実際に話すかどうかは関係ありません)。

つまり、2番目のオプションでは、条件が大まかに次のように変換されることが明らかになります。「パスワードの長さがゼロより大きく、stationIDTextField(トリミング)が空ではなく、usernameTextField(トリミング)が空でない場合、 ...」

于 2009-04-28T17:05:40.687 に答える
1

私は次のことを好みます:

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

このコーディングスタイルで、私は2つのことを達成します。

  • 最初の&&(または||)のために、ifの各余分な行が条件の一部であることが簡単にわかります。
  • 次の行の{により、ifステートメントがどこで終了するかを簡単に確認できます。
于 2009-04-28T17:06:49.373 に答える
1

Option1は、リファクタリングを適用するのに最適です' tempをQueryに置き換えます'。その理由は、誰かが変数の間にコードを詰め込むことができるため、初期化され、コードの動作をチェックして変更します。または、古い値を使用してチェックが行われる可能性があります。初期化とチェックの間にテキストフィールドが更新されました。

だからこれで私の試みは

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

FieldHelperは、パブリック静的メソッドを持つクラスです(C#ではユーティリティクラス/静的クラスとも呼ばれます)

于 2009-04-28T17:08:57.077 に答える