2013-02-19 2 views
7

Sto per migrare del codice allo standard PSR-2. Nel mio codice ho istruzioni if ​​con più righe come espressione:Dichiarazioni long if e PSR-2

if ( $field->getBlockMode() == FieldInterface::BLOCK_MODE_HIDEVAR && 
     !isset($this->enabledBlocks[$field->getBlock()]) 
) { 

} 

Qual è la migliore pratica per scrivere tali espressioni?

+1

Come se vuoi. La raccomandazione è di rendere più breve la dichiarazione di prova: sarà illeggibile a prescindere da come lo scrivi tu. – KingCrunch

+0

Il problema è che dopo "se (" lo spazio bianco non è consentito, quindi non posso impostare l'espressione sulla stessa posizione hoirizobntal come la seguente. E come ho capito, non posso inserire una linea dopo il "if (" etere – Johni

risposta

17

Che ne dite di fare un one-liner per evitare questo problema e rendere la dichiarazione più leggibile:

$blockModeIsHidevar = $field->getBlockMode() == FieldInterface::BLOCK_MODE_HIDEVAR; 
$blockNotEnabled = !isset($this->enabledBlocks[$field->getBlock()]); 

if ($blockModeIsHidevar && $blockNotEnabled) { 

} 

Alternativa:

faccio di solito con metodi, questo potrebbe looke In questo modo:

if ($this->blockModeIsHidevar($field) && $this->blockNotEnabled($field)) { 

} 
// ... 
private function blockModeIsHidevar($field) 
{ 
    return $field->getBlockMode() == FieldInterface::BLOCK_MODE_HIDEVAR 
} 
private function blockNotEnabled($field) 
{ 
    return !isset($this->enabledBlocks[$field->getBlock()]) 
} 

In questo modo, l'ottimizzazione di && ha ancora luogo.

+0

non influisce sulle prestazioni? – Johni

+0

Se è necessario per te che la seconda condizione non venga valutata se la prima è falsa, puoi estrarre i controlli su metodi/funzioni anziché variabili. –

+0

+1 sembra che tu abbia detto più o meno lo stesso di me. – SDC

4

Estrarre prima in espressioni booleane più corte, quindi utilizzare tali variabili nell'istruzione if().

cioè:

$hideVarMode = $field->getBlockMode() === FieldInterface::BLOCK_MODE_HIDEVAR; 
$enabledBlock = !isset($this->enabledBlocks[$field->getBlock()]; 
if($hideVarMode && $enabledBlock) { 
    .... 
} 

(nota, ho anche girato il primo test in un triple-uguale, dal momento che questo è probabile che sia meglio, sentitevi liberi di cambiare di nuovo, se questo non funziona per voi)