2

ときどき、このようなループに遭遇します。コードの繰り返しを回避し、最も読みやすくするために、どのように構造化すべきかわかりません。

この例では C# で記述し、Unity3d エンジンを使用していますが、この質問は一般的なループに関するものであり、ここでは C#/Unity3d に固有のものは何もないことに注意してください。

    // ...

    Vector3 rayPosition  = transform.position;
    Vector3 rayDirection = transform.forward;

    RaycastHit hit;

    Vector3 rayFinish = rayPosition + rayDirection * rangeLeft; // This line repeats...

    while (Physics.Linecast ( rayPosition, rayFinish, out hit ) ) {

        rangeLeft -= hit.distance;

        rayPosition = hit.point;
        rayDirection = Vector3.Reflect(rayDirection, hit.normal);

        rayFinish = rayPosition + rayDirection * rangeLeft; // ...here.

    }

    // ...

(もちろん、このコードの繰り返しは簡単で小さいものですが、これは単なる例です。)

ループを最初に実行する前に条件をチェックする必要があるため、do...while ループにすることはできません。このようなコードを書く最良の方法は何ですか?

4

1 に答える 1

0

テストはループの本体の前に呼び出す必要があるメソッドであるため、do-while ループは少し注意が必要です。以下のコードは重複を削除しますが、読みやすさにどの程度役立つかはわかりません。

while (true) { 
  Vector3 rayFinish = rayPosition + rayDirection * rangeLeft;

  if (!Physics.Linecast ( rayPosition, rayFinish, out hit ))
      break;

    rangeLeft -= hit.distance;

    rayPosition = hit.point;
    rayDirection = Vector3.Reflect(rayDirection, hit.normal);
}

これはもう少し読みやすいかもしれません:

bool linecastGood = true;

while (linecastGood) { 
  Vector3 rayFinish = rayPosition + rayDirection * rangeLeft;

  linecastGood = Physics.Linecast ( rayPosition, rayFinish, out hit )

  if (linecastGood) 
  {
    rangeLeft -= hit.distance;
    rayPosition = hit.point;
    rayDirection = Vector3.Reflect(rayDirection, hit.normal);
  }
}
于 2013-04-09T18:55:20.123 に答える