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 回答