Kod powinien robić to czego się po nim spodziewamy, tego uczy SOLID a w szczególności LSP. Również funkcje powinny robić to co mówi ich nazwa. To ułatwia pracę z kodem a jeśli nie zgadzasz się z tym to popatrzmy na taki kod:

class car {
    int wheels = 4;
    string engine;
}
car mybike = new car();
mybike.wheels = 2;
mybike.engine = null;
Niby kod prawidłowy, kompilator nie będzie marudził ale…
… skąd biedny programista ma wiedzieć, że:
var someCar = mybike;
w zmiennej someCar tak naprawdę jest rower? Taki kod może kusić napisanie takiego potwora:
var isBike = false;
if(someCar.wheels == 2 && someCar.engine == null){
isBike = true;
}
.... a potem to już tylko gorzej
Powyższy przykład z mybike znalazłem na StackOverflow tutaj i moim zdaniem bardzo dobrze obrazuje, dlaczego kod powinien robić to czego się po nim spodziewamy. Dodatkowa ukryta logika to nic innego jak miejsce do pojawiania się błędów.