-1

次のようなifステートメントがいくつかあるプログラムから、奇妙な出力が得られます。

if((m.getLeft(position).state == position.state.wall || m.getLeft(position).state == position.state.border) 
    && (m.getBelow(position).state == position.state.open || m.getBelow(position).state == position.state.visited)){
    check = true;
}

&& と || の両方があります。同じ if 条件で使用されます。getLeft() のセルが壁または境界線のいずれかであり、かつ getBelow() のセルが開いているかアクセス済みの場合、ブール値のチェックを true にします。

このコードは、私が現在書いている方法で、このチェックを適切に実行しますか? おそらくもっと重要なのは、このようなステートメントを書くのは不適切な形式でしょうか? 二つに分けた方が良いでしょうか?

私が見ている特異性がこれらのステートメントに起因するのか、それとも何か他のものに起因するのかはわかりません.私の質問は、一般的なベストプラクティスに関するものです.

編集:すべての入力に感謝します。私は(あまりにも複雑すぎるのではないかと)疑っていました。

EDIT(1年後、振り返って)if (上記をより精力的に言い直すために)神の愛のために、上記のステートメントのようなものを書かないでください似たようなコード行を見つけた場合、 occam のカミソリはおそらくプログラミングほど適切ではないことを思い出してください。

4

4 に答える 4

1

を使用する別のIF方法を使用し&&ます。

if(m.getLeft(position).state == position.state.wall || 
   m.getLeft(position).state == position.state.border){
   if(m.getBelow(position).state == position.state.open || 
      m.getBelow(position).state == position.state.visited){
         check = true;
   }
}
于 2013-02-10T06:22:23.430 に答える
1

複雑なifステートメントは次のようにリファクタリングできます。

if((m.getLeft(position).state == position.state.wall || m.getLeft(position).state == position.state.border)) {
    if((m.getBelow(position).state == position.state.open || m.getBelow(position).state == position.state.visited)){
        check = true;
    }
}

@マコトに感謝:

check = ((m.getLeft(position).state == position.state.wall || m.getLeft(position).state == position.state.border)) && ((m.getBelow(position).state == position.state.open || m.getBelow(position).state == position.state.visited));

そして、あなたのコードとこのコードは「機能します」。

ただし、Java のスタイル ガイドラインに記載されている命名規則にも従うことを忘れないでください。mあなたのコードの内容がわかりません。この種のオブジェクト参照の命名は避ける必要があります。また、あなたのクラスのフィールドのstateようです(仮定)。publicこのようなパブリック アクセス フィールドも避ける必要があります。代わりに と を使用getters()setters()ます。

于 2013-02-10T06:25:18.280 に答える
1

適切に機能しているように見えますが、読むのはかなり難しいです。

if ステートメントでを使用する&&場合は、代わりに新しい if ステートメントをネストすることもできます。ほとんどの場合、これは本質的に同じことです。

于 2013-02-10T06:16:30.077 に答える
1

ブールステートメントを分解すると、次のようになります。

(a == x_1 || a == x_2) && (b == x_3 || b == x_4)

残念ながら、それはその特定のブールステートメントが得られるのと同じくらい簡単です。痛みを大幅に軽減するオプションがあります。

  • コードを 2 つの if ブロックに分割して (以下のリファクタリングに示すように)、そのような複雑なステートメントを必要としないようにコードをリファクタリングするか、または
  • それをメソッドとして抽出し、戻り値を に代入しcheckます。正直なところ、それは真か偽かのどちらかになります。

リファクタリング方法の例を次に示します。m正確には何がわかりません:

public boolean isCheck(M m, Position p) {
    boolean retVal = false;

    if(m.getLeft(p).state == p.state.wall || m.getLeft(p).state == p.state.border)) {
        if((m.getBelow(p).state == p.state.open || m.getBelow(p).state == p.state.visited))
            retVal = true;
         }
     }

     return retVal;
 }

 // call it as such

 check = isCheck(m, position);
于 2013-02-10T06:19:41.993 に答える