2013-08-07 2 views
2

이 코드를 사용하고 있습니다. 진실은 goto없이 더 효율적으로 다시 쓰는 방법을 모른다는 것입니다. 나는 개인적으로 goto (php의 새로운 기능)를 사용하는 것이이 경우에는 괜찮다고 생각하지만, 다른 사람들은 나에게 ok가 아니라고 말하고있다. goto없이 코드를 어떻게 다시 작성해야합니까? 왜 내 코드가 goto로 나쁘다고 생각하니? 나는 경험이 프로그래머가 아니므로 어떤 조언을 내가 잘못하고 있습니다.PHP를 사용하여 goto없이 코드를 다시 작성할 수 없습니다.

check_process: 
    $random_code = substr(number_format(time() * rand(),0,'',''),0,10); 

    $unique_check = $wpdb->get_var(
     "SELECT meta_id 
     FROM {$wpdb->postmeta} 
     WHERE meta_key = 'unique_code' 
     AND meta_value = '{$random_code}' 
     LIMIT 1" 
    ); 

    if ($unique_check == NULL) { 
     // OK 
    } 
    else { 
     goto check_process; // go back and generate another unique code if are same 
    } 

답변

1
do{ 
    $random_code = substr(number_format(time() * rand(),0,'',''),0,10); 

    $unique_check = $wpdb->get_var(
     "SELECT meta_id 
     FROM {$wpdb->postmeta} 
     WHERE meta_key = 'unique_code' 
     AND meta_value = '{$random_code}' 
     LIMIT 1" 
    ); 
} while (! is_null($unique_check)); 
0
do { 

... 

} while {!is_null($unique_check)) 

나는 당신이 그것에 대해 끊임없이 주장 할 수있는 것 같아요,하지만 난 while에 대한 고토 :

0

이 작업과 같은 이상이 스타일을 선호 :

$check = true; 
while($check){ 
    //do the stuff 
    if($unique_check == NULL){ 
     $check = false; 
    } 
} 

do-while의 경우에도 더 간단합니다.

do { 
    //do the stuff 
} while($unique_check != NULL); 
0

do while 루프를 사용하면 어떨까요?

do { 
    $random_code = substr(number_format(time() * rand(),0,'',''),0,10); 

    $unique_check = $wpdb->get_var(
    "SELECT meta_id 
    FROM {$wpdb->postmeta} 
    WHERE meta_key = 'unique_code' 
    AND meta_value = '{$random_code}' 
    LIMIT 1" 
); 

} while (!is_null($unique_check)); // go back and generate another unique code if are same 

goto가 아닌 이런 종류의 루프를 사용하는 것이 더 깨끗합니다.

0

가장 오랜 시간 동안 goto에 싫은 내면, goto을 사용하면 코드에서 구조가 여러 개 만들어져 이론적 인 포인트가 실제로 손상됩니다. goto의 대안은 하루에 gosub이었습니다. gosub은 그것이 수행되고있을 때 항상 호출 지점으로 돌아갔습니다. 그래서 오늘 gosub은 기능과 같습니다.

그러나 일부 코드를 분해하고 어셈블리 지침을 읽으면 모든 것을 뒤틀려서 jmp에 대한 수백 건의 참조가 정확히 goto와 같습니다. 그러니 수치로 가라.

0

goto는 쉬운 대안이 될 수 있지만 당신이 말한 것처럼 나쁜 습관이 될 수 있습니다!

주된 이유는 질량이 작은 것이 아닙니다. 너무 익숙해지면 자주 사용하게 될 것입니다. 코드를 읽고 이해하려고하는 다른 개발자에게 문제가됩니다. 실제로 하나의 고토를 사용하면 쉽지만 적어도 10 번 상상해보십시오.이 "스파게티 코드"를 이해하는 데 더 많은 시간이 필요합니다.

더 나은 연습은 코드에서 특정 알고리즘으로 "점프"하고 가능한 경우 다른 대답과 같은 루프를 사용하는 기능을 사용하는 것입니다. 여기

당신이 고토 사용하는 경우 어떻게 볼 수 있습니다 : D http://xkcd.com/292/

+0

내가 고토을 사용하지 않지만 만약 당신이 어셈블리 코드를 작성한 경우에 당신이 언젠가 고토보다 다른 선택이 없다는 것을 깨닫게됩니다. – DevZer0

+0

당신의 말이 맞습니다! 어셈블리 코드에서는 다른 기회가 없습니다. 하지만 여기서 우리는 php에 대해 이야기하고 있으며 여기에는 함수와 클래스의 가능성이 있습니다. –