Domanda

È una pratica di codifica accettabile?

public class MessageFormat {
    private static final Color DEFAULT_COLOR = Color.RED;

    private Color messageColor = DEFAULT_COLOR;

    public MessageFormat(Person person) {
        Color color = person.getPreferredColor();
        messageColor = (color != null) ? color : messageColor; // this line
    }
}

o sto meglio con il classico ...

if (color != null) {
    messageColor = color;
}
È stato utile?

Soluzione

L'uso dell'operatore?: dovrebbe essere limitato per rendere il codice più leggibile. Un classico esempio:

a = sprintf( "There are %i green bottle%s on the wall.", i, (i==1?"":"s") );

In questo caso il codice sarebbe meno leggibile se lo dividessi in circa 5 righe if / else.

In genere metto le parentesi attorno all'intero operatore in modo che durante la lettura lo analizzi mentalmente come un singolo valore.

 messageColor = (color != null ? color : messageColor); 

Un'altra variante è

messageColor = color || messageColor;

Che in alcune lingue valuterà di "colore, a meno che il colore non valuti" falso ", nel qual caso il valore di messageColor. A mio avviso, questo dovrebbe essere evitato in quanto potrebbe confondere le persone.

La cosa più importante è essere coerenti in modo che la prossima persona che legge il tuo codice (anche se sei tu) abbia un sovraccarico cognitivo minimo.

Altri suggerimenti

La leggibilità, la facilità di comprensione ecc. sono le stesse in questo caso ( Voglio dire, dai ... ). Non mi piace la duplicazione e l'apparente auto-assegnazione nel primo esempio; si tradurrebbe in qualcosa del tipo:

if (colour != null) {messageColour = colour;}
   else {messageColour = messageColour;};

che è un po 'stupido.

Di solito scrivo la seconda in una riga, ma questa è una questione di fantasia individuale. linee guida sullo stile di codifica:

if (colour != null) {messageColour = colour;};

EDIT (ora sono più supponente di 8 anni fa)

Dal momento che stai cercando le migliori pratiche:

// Use default visibility by default, especially in examples.
// Public needs a reason.
class MessageFormat {
    static final Color DEFAULT_COLOR = Color.RED;

    // Strongly prefer final fields.
    private final Color messageColor;

    // Protect parameters and variables against abuse by other Java developers
    MessageFormat (final Person person) {
        // Use Optionals; null is a code smell
        final Optional<Color> preferredColor = person.getPreferredColor();
        // Bask in the clarity of the message
        this.messageColor = preferredColor.orElse(DEFAULT_COLOR);
    }
}

L'uso dell'operatore ternario è spesso un problema delicato, insieme ad altri standard di codifica. Il suo utilizzo è probabilmente meglio determinato dagli standard di codifica sul tuo sito.

Tuttavia, in questa specifica situazione, consiglierei sicuramente la seconda opzione; non solo è più chiaro, ma l'uso dell'operatore ternario non è assolutamente necessario qui. Non è necessario riassegnare messageColor a se stesso, quindi l'unica funzione dell'operatore ternario in questa situazione particolare è l'offuscamento del codice.

L'operatore ternario è più comune tra i programmatori C. In C se si evitano le strutture di controllo, è spesso possibile ottenere una pipeline migliore, in quanto non esiste alcuna previsione di diramazione che vada storto. Dubito che vedresti differenze di prestazioni in Java, e il modello if-null-then-assegnato è molto più comune del ternario. Tuttavia, se stai mantenendo una base di codice esistente, di solito è meglio rimanere coerenti con il codice esistente.

Se ti ritrovi a fare molto, puoi scrivere una funzione defaultIfNull , firstNonNull o coalesce che può rendere il codice ancora di più conciso. Apache Commons Lang include una funzione defaultIfNull .

Alcune lingue includono un operatore || = , che è il solito linguaggio per valori predefiniti in quelle lingue.

Preferisco il secondo perché esprime più chiaramente ciò che intendi: vuoi cambiare il colore solo se non è nullo. Il primo metodo non lo rende così chiaro.

Nel tuo caso, preferirei l'implementazione 'classica', perché per me è più veloce da capire, che vuoi usare un nuovo colore solo se la persona ne ha uno preferito.

A volte lo uso nelle chiamate di metodo se voglio evitare gli NPE, ma di solito elimino quei brutti pezzi di codice in uno dei prossimi refactoring;)

Gli operatori ternari vengono spesso abusati perché il codice che producono sembra intelligente e compatto.

In effetti rendono il codice meno leggibile e più soggetto a errori. Quando possibile, è consigliabile utilizzare la versione più lunga di

 if ( <condition> ) {
     <action> ;
 }

Invece di una sintassi ternaria.

Mi sembra perfetto (uso molto l'operatore ternario di Python), ma questo tipo di problema di stile è di solito molto soggettivo. Se il progetto ha un documento di stile di codifica, potresti volerlo verificare.

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