2010-05-14 15 views
5

Ho visto un sacco questo tipo di codice di recente:Assegnazione condizionali

if ($foo = $bar->getFoo()) 
{ 
    baz($foo); 
} 

È questo considerato pratica buona o cattiva?

Per esempio, IDE Netbeans dare un avviso se si utilizza questo tipo di codice:

possibile assegnazione accidentale, incarichi in condizioni dovrebbero essere evitati

Cosa ne pensi?

+0

Intendevi se ($ pippo == $ bar-> getFoo())? –

+8

No, questo è il punto :) – DuoSRX

+0

Questo ovviamente ha volato sopra la mia testa :) Quindi il condizionale è controllare che $ bar-> getFoo() non causi un errore? È giusto? –

risposta

4

È uno strumento utile che devo ammettere di utilizzare occasionalmente per evitare una riga aggiuntiva per un compito. Da un lato, può essere cattiva pratica da parte di alcuni, perché:

  • Non è un modo di dire in altre lingue comuni
  • E 'meno leggibile

D'altra parte:

  • La conversione booleana implicita non si verifica in altre lingue, ma è ampiamente calcolata sulla posizione in cui esiste. Viceversa, gli operatori di assegnazione condizionale esistono in Ruby e Javascript (come esempi), ma non in PHP. Dovremmo limitare il nostro uso dei costrutti linguistici solo a quelli trovati in tutte le lingue simili? Probabilmente no.
  • Meno leggibile da chi?

Devo notare che cerco di evitarlo perché lo trovo meno leggibile il più delle volte, ma per me è una preferenza puramente personale. Dove lo trovo utile, lo uso.

4

È un modo semplice per gli errori di intrufolarsi, ma è pratica comune in PHP. Soprattutto durante le cose come directory traversal dove stai facendo cose come while (($dir = readdir($handle)) !== FALSE)

Se puoi evitarlo. Evitalo.

+0

'! == FALSE' è ridondante, ma rende l'istruzione più comprensibile. Ma perché non usare '== TRUE'? È ancora più semplice! – T30

+1

readdir restituisce FALSE se la directory è vuota. Altrimenti restituisce l'elemento successivo nella directory. Devi controllare se non è falso per continuare a leggere. Dovrebbe fare un rigoroso controllo di tipo con una tripla uguale. – jlindenbaum

2

Mentre questa è una sintassi valida ei risultati saranno come previsto, è una cattiva abitudine. Manca la leggibilità, c'è un potenziale per sviluppare una cattiva abitudine di mettere = quando intendevi ==, e i tuoi occhi continueranno a tornare su questa linea quando stai cercando di trovare veri bug all'interno di un'applicazione. Non userei questo stile di scrittura. In questo caso, è sufficiente ottenere il valore restituito e quindi verificare il valore restituito ... o, meglio ancora, utilizzare la gestione delle eccezioni per evitare di impantanarsi con un sacco di istruzioni if.

+1

+1 questo è un avanzo dai giorni C, dove questa era pratica comune (cattiva). Un sacco di persone lo fanno ancora perché pensano che li faccia [sembra intelligente] (http://stackoverflow.com/questions/2101875/what-are-some-programming-questions-or-mistikes-you-get-wrong- solo-as-you-get-b/2.151.844 # 2.151.844). Il codice –

4

Io uso questa sintassi tutto il tempo ... Lo trovo 100% leggibile, perché sono così abituato a vedere questo tipo di linea. Avere una linea in più di codice per l'assegnazione sembra uno spreco di spazio per me.

+1

deve essere letto. Se una riga di codice aggiuntiva aumenta la leggibilità -> aggiungi una riga. Non vorrei ereditare il tuo codice minisito. –