我不时会遇到像这样的循环,我不确定它应该是什么结构,以避免代码重复并使其最具可读性。
请注意,虽然在这个例子中我使用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循环,因为在首次运行循环之前需要检查条件。编写这样的代码的最佳方法是什么?
答案 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);
}
}