전제
다음 코드는 언어 나 원하는 기능에 관계없이 잘못된 형식으로 간주되어야합니다.
while( true ) {
}
찬반론
while( true )
루프는 열악한 형태이다 :
- while 루프의 묵시적 계약을 끊습니다.
- while 루프 선언은 유일한 종료 조건을 명시 적으로 명시해야 합니다.
- 영원히 반복된다는 것을 의미합니다.
- 종료 절을 이해하려면 루프 내의 코드를 읽어야합니다.
- 영원히 반복되는 루프는 사용자가 프로그램 내에서 프로그램을 종료하는 것을 방지합니다.
- 비효율적입니다.
- "true"확인을 포함하여 여러 루프 종료 조건이 있습니다.
- 버그가 발생하기 쉽습니다.
- 각 반복마다 항상 실행되는 코드를 어디에 넣을지 쉽게 결정할 수 없습니다.
- 불필요하게 복잡한 코드로 이어집니다.
- 자동 소스 코드 분석.
- 버그, 프로그램 복잡성 분석, 보안 검사를 찾거나 코드 실행없이 다른 소스 코드 동작을 자동으로 도출하기 위해 초기 차단 조건을 지정하면 알고리즘이 유용한 불변성을 결정하여 자동 소스 코드 분석 메트릭을 개선 할 수 있습니다.
- 무한 루프.
- 모든 사람이 항상
while(true)
무한이 아닌 for 루프를 사용 하는 경우 루프에 실제로 종료 조건이 없을 때 간결하게 통신 할 수있는 기능을 잃게됩니다. (아마도 이것은 이미 일어 났으므로 요점은 논쟁의 여지가 있습니다.)
"이동"의 대안
다음 코드가 더 나은 형식입니다.
while( isValidState() ) {
execute();
}
bool isValidState() {
return msg->state != DONE;
}
장점
플래그가 없습니다. 아니 goto
. 예외 없음. 변경하기 쉽습니다. 읽기 쉬운. 쉽게 고칠 수 있습니다. 추가로 코드 :
- 루프 자체에서 루프의 워크로드에 대한 지식을 분리합니다.
- 코드를 유지하는 누군가가 기능을 쉽게 확장 할 수 있습니다.
- 여러 종료 조건을 한 곳에서 할당 할 수 있습니다.
- 실행할 코드에서 종료 절을 분리합니다.
- 원자력 발전소에 더 안전합니다. ;-)
두 번째 요점이 중요합니다. 코드가 어떻게 작동하는지 모르는 상태에서 누군가가 나에게 메인 루프가 다른 스레드 (또는 프로세스)에 CPU 시간을 허용하도록 요청하면 두 가지 솔루션이 떠 오릅니다.
옵션 1
일시 중지를 쉽게 삽입하십시오.
while( isValidState() ) {
execute();
sleep();
}
옵션 # 2
실행 무시 :
void execute() {
super->execute();
sleep();
}
이 코드는 포함 된 루프보다 더 간단합니다 (따라서 읽기 쉽습니다) switch
. 이 isValidState
메서드는 루프가 계속되어야하는지 여부 만 결정해야합니다. 이 방법의 주력이로 추상화한다 execute
서브 클래스가 기본 동작을 재정의 할 수 있습니다 방법, (어려운 작업은 임베디드를 사용 switch
하고 goto
).
Python 예
StackOverflow에 게시 된 다음 답변 (Python 질문에 대한)을 대조하십시오.
- 영원히 반복하십시오.
- 사용자에게 선택 사항을 입력하도록 요청합니다.
- 사용자 입력이 '다시 시작'이면 계속 반복됩니다.
- 그렇지 않으면 루프를 영원히 중지하십시오.
- 종료.
암호
while True:
choice = raw_input('What do you want? ')
if choice == 'restart':
continue
else:
break
print 'Break!'
대:
- 사용자의 선택을 초기화하십시오.
- 사용자의 선택이 '다시 시작'이라는 단어 인 동안 반복합니다.
- 사용자에게 선택 사항을 입력하도록 요청합니다.
- 종료.
암호
choice = 'restart';
while choice == 'restart':
choice = raw_input('What do you want? ')
print 'Break!'
여기 while True
에서 오해의 소지가 있고 지나치게 복잡한 코드가 생성됩니다.