Yoda hipster style

Yoda hipster style

Lorsqu'il est nécessaire de faire un test d'égalité, on utilise la commande if permettant de tester une condition par exemple l'égalité entre deux opérandes.

Puisque l'opérateur d'égalité == est commutatif, alors cette condition peut s'écrire de deux façons.

if(null == name) {
  doSomething(name);
} else {
  doSomethingElse(name);
}
Exemple de code Java
if(name == null) {
  doSomething(name);
} else {
  doSomethingElse(name);
}
Autre exemple de code Java

name == null ou null == name ?

Dans la plupart des cas, ça n'a aucune importance. On retrouvera dans la grande majorité des code base la première version qui semble plus naturelle à un lecteur d'une langue qui se lit de gauche à droite. D'ailleurs la deuxième version est souvent nommée condition Yoda.

Pourquoi appliquer la condition Yoda ? Cela concerne certains langages dans lesquels une affectation est une instruction et non une expression. C'est à dire qu'il est tout à fait valide d'écrire if(name = null) et if(name == null), et l'erreur entre les deux instructions est possible. Écrire une affectation dans une condition est souvent une erreur de frappe, car il est difficile de maintenir ce code dans lequel une instruction sert à la fois d'affectation et le résultat de cette affectation sert de condition.

En condition Yoda, l'erreur de frappe sera vite repérée car si on écrit if(null = name) au lieu d'écrire if(null == name), le compilateur va nous prévenir :

The left-hand side of an assignment must be a variable

equals()

En langage objet, il existe une autre façon de comparer deux valeurs, par exemple name.equals(null).

Mais prenons un exemple un peu plus intéressant qui pourra s'écrire en condition Yoda : name.equals(""). En Java, la variable name peut valoir null et il n'y a rien qui l'indique au compilateur. Ainsi, lors de l'exécution du code, on peut se retrouver avec une NullPointerException.

En revanche, "".equals(name) aura toujours le comportement attendu, car si name est null alors la condition sera fausse. Son équivalent non Yoda serait donc plutôt une double condition : if(name != null && name.equals("").

En savoir plus :