Come posso evitare gli errori usando di nuovo lo stesso nome di variabile?

5

Questo non è un caso raro e si verifica spesso con me e ho impiegato innumerevoli volte a provare a eseguire il debug del codice.

Ultimo esempio, questo codice PHP dove ho usato $email per il parametro e anche per l'oggetto.

private function _mail( $email )
{
    if( filter_var( $email, FILTER_VALIDATE_EMAIL ) ):
        $email = new Zend_Mail();
        $email->setSubject( $this->request->post('subject') )
            ->setBodyHtml( $this->request->post('message') )
            ->setFrom( $this->request->post('from') )
            ->addTo( $email )
            ->send();
        unset($email);
    endif;
}

Stava generando un errore, strtr() si aspetta che il parametro 1 sia un oggetto stringa dato ed è stato davvero frustrante sfogliare le librerie zend per vedere quale oscura dichiarazione di stringhe stesse generando questo errore.

Come evitare tali errori?

    
posta Shubham 15.01.2013 - 15:10
fonte

5 risposte

13

Un buon aspetto dei moderni linguaggi di programmazione è che puoi avere nomi di variabili grandi. Nella programmazione orientata agli oggetti, che stai utilizzando, le convenzioni Java sono molto popolari.

Quindi sarebbe meglio avere un nome descrittivo per l'oggetto Zend_Mail, come

$zendMail = new Zend_Mail();

All'inizio consumerà un po 'più di tempo prima che il cervello si sposti e diventi un'abitudine, ma quel tempo avrà un enorme ritorno di investimenti e lo stress da dover eseguire il debug di casi simili.

    
risposta data 15.01.2013 - 15:26
fonte
5

Penso che tu abbia due concetti diversi qui. Hai l'indirizzo email di un destinatario e un messaggio e-mail che verrà inviato al destinatario. Quindi perché no:

private function _mail( $recipient )
{
    if( filter_var( $recipient, FILTER_VALIDATE_EMAIL ) ):
        $mail = new Zend_Mail();
        $mail->setSubject( $this->request->post('subject') )
            ->setBodyHtml( $this->request->post('message') )
            ->setFrom( $this->request->post('from') )
            ->addTo( $recipient )
            ->send();
    endif;
}
    
risposta data 15.01.2013 - 20:57
fonte
2

This isn't a rare case and occurs with me often and I spent countless time trying to debug the code.

Questo mi dice due cose:

  1. Se fa male, smetti di farlo. Dici che questo problema "si verifica spesso con me", il che significa che devi fare uno sforzo maggiore per evitare questo tipo di problema. Non cercare di utilizzare due variabili con lo stesso nome, mai, anche quando sei sicuro che funzionerà. Ci sono due possibilità: a) hai ragione e funziona, ma il tuo codice è molto più difficile da capire di quanto dovrebbe essere; oppure b) hai torto e, beh, hai visto cosa succede quando ti sbagli.

  2. Impara dall'esperienza. Se continui a scrivere lo stesso tipo di bug, dovresti essere abbastanza bravo a riconoscere i sintomi e a individuare il problema. Sapendo che hai una propensione a creare una certa classe di bug, dovresti essere costantemente alla ricerca di indicazioni che lo hai già fatto di nuovo. Utilizza le asserzioni per verificare che una variabile contenga il tipo di dati che ti aspetti. Metti in discussione le tue ipotesi. Scrivi alcuni test unitari per testare i singoli componenti.

risposta data 16.01.2013 - 00:04
fonte
-1

In PHP prefisso funzione / parametri del parametro con 'in' - e non usare nessuna variabile che inizi con 'in' all'interno del corpo. Non è l'ideale, ma funziona.

Anche Dimitris punta su nomi più descrittivi.

    
risposta data 15.01.2013 - 16:03
fonte
-1

Il mio IDE lo fa per me. Eclipse ha "modelli" per il completamento automatico del codice (STRG + Spazio) Ho detto al mio Eclipse di aggiungere sempre un prefisso ai parametri del metodo.

Ad esempio il tuo metodo:

funzione privata _mail ($ destinatario)

sarebbe automaticamente completato automaticamente con $ pRecipient.

Short Rule: Prefisso sempre i parametri del metodo, per evitare conflitti variabili all'interno del corpo del metodo.

sidenote: pensa di usare le interfacce invece degli oggetti come parametri del metodo.

    
risposta data 17.01.2013 - 09:32
fonte

Leggi altre domande sui tag