2013-04-09 5 views
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. 

    } 

    // ... 

(물론, 반복이 코드는 사소한 작은이지만, 그냥 예입니다.)

그것은 루프, 조건이 필요하기 때문에 동안 ... 할 일에 그것을 만들 수는 없습니다 루프를 처음 실행하기 전에 확인해야합니다. 이런 식으로 코드를 작성하는 가장 좋은 방법은 무엇입니까?

답변

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); 
    } 
} 
+0

사실, 난 전에 첫 번째 변종이 있고, 다음이로 리팩토링. 루프가 아닌가 (사실) 항상 나쁜 연습으로 간주됩니까? 두 번째 코드 중복을 피할 수는 있지만 제 의견으로는 읽기 쉽지 않습니다. 코드를 최소한 두 번 스캔하면 코드가 무엇을하는지 이해해야합니다. –

+0

@ golergka : 버전 2가 더 읽기 쉽다고 생각하는 이유는 (true)는 피해야한다는 데 동의합니다. 나는 그 의도를 조금 더 명백하게 (IMO)하기 위해 편집했지만, 여전히 훌륭하지는 않다. 근본적인 문제는 루프 본문의 중간에서 필요한 계산과 루프 조건으로 반환 값을 모두 사용하기 위해 하나의 호출을 사용하려는 것입니다. 루프 조건은 처음이나 마지막에만 올 수 있으므로 값을 저장하고 while 조건에서 사용하거나 루프 중간에서 벗어날 수있는 옵션 이외의 옵션은 표시되지 않습니다. 또는 goto를 사용하십시오 ... –

관련 문제