Domanda

Nel mio ufficio è nata una discussione sull'uso degli operatori ternari. Ci sono due lati di questa discussione.

Lato 1) Gli operatori ternari sono facili da scrivere e leggere, quindi la convenienza è un risparmio netto sui costi.

Lato 2) Che gli operatori ternari sono difficili da mantenere perché richiedono un eccesso di abbandono del codice nel caso in cui debbano essere modificati per essere anche leggermente più complessi.

Punti nerd aggiuntivi se puoi citare qualsiasi studio effettivo condotto da un istituto di alto livello su questo argomento ... Sono molto interessato a vedere dati concreti su questo.


La mia teoria è che il codice migliore sia il codice che può cambiare e adattarsi facilmente e che minore è la complessità richiesta dal cambiamento, minori sono le possibilità di una pausa. Esempio:

$id = $user->isRegistered() ? $user->id : null;

Ok, quindi questo è completamente valido, ma cosa succede quando il codice deve cambiare per diventare qualcosa di leggermente più complesso?

$id = null;
if ($user->isRegistered() || $user->hasEmail()) {
    $id = $user->id;
}

Qualsiasi programmatore sano dovrebbe guardare il ternario e convertirsi in standard if / else. Tuttavia, ciò ha richiesto una modifica di 4 righe rispetto a partire da:

if ($user->isRegistered()) {
    $id = $user->id;
}

Che richiederebbe solo un cambio di 1 riga.

È stato utile?

Soluzione

Trovo che una volta che ti sei abituato alla sintassi entrambe le opzioni sono ugualmente leggibili (a condizione che non esageri con nessuno dei due) e quindi non è un problema per me.

Per quanto riguarda il tempo più efficiente, risponderò con una domanda odiosa: perché te ne importa? Entrambe le opzioni impiegano meno di 20 secondi per convertirsi in un'istruzione if equivalente.

Personalmente trovo che quando trovo il modo di scalpellare i secondi dal mio tempo di programmazione è una forma di procrastinazione. Lavoro meglio quando mi concentro sul fare le cose e lasciare che i piccoli dettagli di leggibilità si risolvano da soli attraverso l'esperienza.

Altri suggerimenti

Resterei fedele all'operatore ternery nel tuo esempio.

   $id = ($user->isRegistered() ||  $user->hasEmail())? $user->id : null;

Fintanto che l'unico "ramo" è decidere quale valore deve essere assegnato a una variabile, l'operatore ternery è più leggibile delle clausole if-else, perché non duplica potenzialmente la funzione effettiva eseguita, (in questo caso - questo è il codice " $ id = ")      Se le condizioni logiche diventano complesse, semplificale.

   bool $isReg    = $user->isRegistered(),
        $hasEmail = $user->hasEmail();
   $id = ($isReg || $hasEmail)?  $user->id : null;

Mi piace usare l'operatore ternario ogni volta che ho un'espressione di una riga in cui il valore dipende da una condizione booleana appropriata. In effetti, se devo scegliere tra l'assegnazione a una variabile e posso scegliere tra Espressione 1 ed Espressione 2, utilizzo spesso un ternario.

Tuttavia, se le espressioni hanno un effetto collaterale, riscriverò immediatamente l'intera cosa come un'istruzione if (). L'uso dell'operatore ternario per il controllo del flusso è piuttosto confuso per la maggior parte delle persone.

Le operazioni ternarie hanno il loro posto; è di solito per semplificare il codice quando si esegue un'attività banale. Ad un certo punto, tuttavia, potrebbe essere necessario ripensare la strategia se l'istruzione condizionale diventa troppo complessa. Sta determinando quando quel punto è che diventa la sfida. Solo l'esperienza può guidarti allora.

Quindi, non penso che ce ne sia uno "giusto". rispondi fintanto che il risultato finale è codice pulito, leggibile e gestibile. Le righe extra di codice per l'istruzione if non dovrebbero nemmeno essere prese in considerazione quando si effettua questa determinazione (poiché il numero di righe di codice non necessariamente correla 1 a 1 alla complessità del codice .)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top