Pergunta

Será esta uma prática de codificação aceitável?

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
    }
}

ou estou melhor fora de ir com o clássico ...

if (color != null) {
    messageColor = color;
}
Foi útil?

Solução

O uso do operador?: Deve limitar-se ao código make mais legível. Um exemplo clássico:

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

Neste caso, o código seria menos legível se você quebrou-o em cerca de 5 linhas else if /.

Eu geralmente colocar colchetes ao redor de todo o operador de modo que quando lê-lo mentalmente analisá-lo como um único valor.

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

Outra variante é

messageColor = color || messageColor;

O que em algumas línguas irá avaliar a "cor, a menos que avalia cor para 'false', caso em que o valor de messagecolor. Na minha opinião isso deve ser evitado, pois pode confundir as pessoas.

A coisa mais importante é ser consistente para que a próxima pessoa que lê o seu código (mesmo se é você) tem sobrecarga cognitiva mínimo.

Outras dicas

A legibilidade, facilidade de compreensão etc. são os mesmos neste caso ( Quero dizer, vamos lá ... ). Eu não gosto da duplicação e atribuição auto aparente no primeiro exemplo; que se traduziria em algo como:

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

que é um pouco estúpido.

Eu costumo escrever o segundo em uma linha, mas isso é uma questão de resp fantasia individual. codificação diretrizes de estilo:

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

Editar (estou agora mais opinativo do que há 8 anos)

Uma vez que você está procurando as melhores práticas:

// 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);
    }
}

O uso do operador ternário é muitas vezes uma questão sensível, juntamente com outros padrões de codificação. A sua utilização é provavelmente mais determinada por padrões de codificação em seu site.

No entanto, nesta situação específica eu recomendaria definitivamente a segunda opção; Não só é mais clara, mas o uso do operador ternário é totalmente desnecessário aqui. Não há necessidade de re-atribuir messagecolor a si mesmo, então a única função do operador ternário nesta situação em particular é ofuscação de código.

O operador ternário é mais comum entre os programadores C. Em C se você evitar estruturas de controle, muitas vezes você pode obter uma melhor canalização, como não há previsão de desvios para dar errado. Eu duvido que você iria ver qualquer diferença de desempenho em Java, e o padrão se nulo-then-assign é muito mais comum do que o ternário. No entanto, se você está mantendo uma base de código existente, normalmente é melhor para ficar consistente com o código existente.

Se você está fazendo isso muito, você pode escrever uma defaultIfNull, firstNonNull ou função coalesce que pode tornar o código mais conciso. Apache Commons Lang inclui uma função defaultIfNull.

Alguns idiomas incluem um operador ||=, que é a expressão usual para inadimplente valores nessas línguas.

Eu prefiro a segunda porque é mais claramente expressar o que quer dizer: você só quer mudar a cor se não é nulo. O primeiro método não faz isso tão claro.

No seu caso, eu prefiro a implementação 'clássico', porque para mim é mais rápido de entender, que você só quer usar uma nova cor, se a pessoa tem um preferido.

Às vezes eu usá-lo em chamadas de método se eu quiser evitar NPE, mas eu costumo elimate essas peças feias de código em um dos próximos refatorações;)

operadores ternários muitas vezes se abusado como o código que produzem parece inteligente e compacto.

Na verdade, eles tornar o código menos legível e mais propenso a erros. Sempre que possível, é aconselhável utilizar a versão mais longa

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

Em vez de uma sintaxe ternário.

Parece-me muito bem (eu uso operador ternário do Python muito), mas este tipo de questão de estilo geralmente é altamente subjetiva. Se o projeto tiver um documento estilo de codificação, você pode querer verificar isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top