我应该如何构建这个循环?

时间:2013-04-09 18:39:25

标签: loops readability

我不时会遇到像这样的循环,我不确定它应该是什么结构,以避免代码重复并使其最具可读性。

请注意,虽然在这个例子中我使用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循环,因为在首次运行循环之前需要检查条件。编写这样的代码的最佳方法是什么?

1 个答案:

答案 0 :(得分: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);
  }
}