3

あなたがこのコードを持っていると仮定します:

function doSomething($array)
{
  for($i = 0; $i < sizeof($array); $i++)
  {
    if ($array[$i] == "ok")
      return true;
  }

  return false;
}

PHP固有(これはすべての言語に適用されます)またはこの特定の例について話しているのではないことに注意してください。これは、forループを中断することです(この場合、trueを返し、ループを停止します)。

私の先生によると、これは非常に、非常に悪いことであり、行われていない習慣です。

ループから抜け出すことは本当に行われていない習慣ですか?

ありがとう

4

7 に答える 7

6

ループを中断したり、ループから戻ったりしてもまったく問題ありません。

あなたの先生がおそらく言及しているのは、関数がループに拡張された戻り点を1つだけ持つべきという古典です。この背後にある理論的根拠は、制御フローは常にできるだけ簡単で理解しやすいものにする必要があるということです。何も考えずに守らなければならないという厳格なルールではありません。

breakandを使用せずにサンプルを書き直すにはreturn:

function doSomething($array)
{
  $ret = false;
  for($i = 0; $i < sizeof($array) && !$ret; $i++)
  {
    if ($array[$i] == "ok")
      $ret = true;
  }

  return $ret;
}

それを読んで維持するのは苦痛です。あなたのものはもっと簡潔です。

于 2011-03-31T14:33:14.357 に答える
1

ジャクソンのようないくつかのプログラム設計アプローチは、ループを壊すこととは実際には友達ではありません。これはかなり学術的な議論であり、実際には実際には従われていません。

于 2011-04-01T15:12:16.693 に答える
1

可能であれば、ループの中断は避けたいと思います。ループが大きくなると、ますます読みにくくなります。あなたのコードやその特定の関数に精通していない人は、最初の行を見るだけで、ループが配列全体を反復すると想定します。それ以外のことを行うのは「驚くべきこと」であり、CleanCode の哲学の「最小の驚きの原則」を破るものです。ループを終了する条件が複数ある場合、for ループは探しているものではありません。それがwhileループの目的です。

function doSomething($array) {
    $found = false;
    $i = 0;

    while ($i < sizeof($array) && !$found) {
        if ($array[$i] == "ok") {
            $found = true;
        }
        $i++;
    }

    return $found;
}
于 2011-03-31T14:44:48.080 に答える
1

それが悪い習慣になるとは思いません。ループを壊したり、ループ内で return を使用したりするようなことは、不用意に行うべきではありません。

私が初心者の頃、私はいつもこれらのことを聞いていました。これを使わないか、あれを使わないでください。しかし、後で私は、彼らがこれを言っているのは、新参者がこれらのものを不用意に使用して悪い間違いを犯さないようにするためだけであることに気付きました. そして、これに気づかず、後に自分自身が教師になる人々は、これらは何か悪いものであったため、あなたを遠ざけるでしょう.

そうです、それを使用してください。時には非常に便利です。ここで他の人が述べたように、これらを使用するときに気にしなければならないすべてのことに注意してください. それらを使用してはいけない場合を学びます。

(もう 1 つ:ループの状態で配列の次元を取得することは、実際には悪い習慣と見なされます。すべての反復でサイズを取得する必要はありません。

それ以外の:

for($i = 0; $i < sizeof($array); $i++)

使用する:

$size=sizeof($array);
for($i = 0; $i < $size; $i++)

)

于 2011-03-31T14:49:32.810 に答える
0

ループを中断することは何も悪いことではありません。非常に限られた後藤のようなものです。あなたの先生を気にしないでください:-)

于 2011-03-31T14:32:54.183 に答える
0

ループを破ることが悪い習慣だとは思いません。ただし、状況に応じて、通常はbreakまたはを使用して行います。continue

于 2011-03-31T14:33:09.173 に答える
0

breakor continue(またはそれに相当するもの)を使用することはよくないとよく言われます。私はとにかくそれらを使用します:-P

これを行う別の方法は、すべてのコードをifまたはでラップすることですelse

function doSomething($array)
{
  for($i = 0; $i < sizeof($array); $i++)
  {
    if ($array[$i] != "ok"){
       // do stuff...
    }
    else{
      // do something else
      // or omit this else block to do nothing
    }
  }
}

returnループからの ingの場合。ループの外側に変数を設定し、必要に応じてループを中断してから、変数を返すことをお勧めします。

$ret = false;
function doSomething($array)
{
  for($i = 0; $i < sizeof($array); $i++)
  {
    if ($array[$i] == "ok"){
      $ret = true;
      break;
    }
  }

  return $ret;
}
于 2011-03-31T14:34:09.207 に答える