👉 Que compile no significa que haga lo que se pide. Pero que compile y que haga lo que se necesita, tampoco significa que la implementación sea correcta.
Estos son algunos ejemplos para mejorar nuestros condicionales.
Porque las buenas prácticas distinguen a los buenos desarrolladores.

Click aquí para una versión accesible de la infografía (apta para lectores electrónicos)
“if” redundantes: cómo simplificar tu código
Caso 1:
if (cliente != null)
return cliente;
else
return null;
El if es redundante. Con return cliente, si cliente es un objeto, se devolverá ese objeto, y si cliente es null se devolverá null.
Caso 2:
if (existe(articulo) == true)
return true;
else
return false;
Basta con retornar existe(articulo), ya que esta función retorna el valor true o false buscado.
Caso 3:
if (edad < 18)
precio -= precio*0.1;
pasajeros++;
else
pasajeros++;
No toda la estructura es innecesaria, pero puede reescribirse como:
if (edad < 18)
precio -= precio*0.1;
pasajeros++;
Caso 4:
if (tipoAnimal == "perro")
animal.Ladrar();
else if (tipoAnimal == "gato")
animal.Maullar();
Si el comportamiento depende del tipo del objeto, puede haber un problema de diseño. En ese caso sería mejor usar polimorfismo para que cada clase implemente su propio comportamiento:
Animal animal;
animal.emitirSonido();