Dobrze napisany kod nie powinien wprowadzać w błąd

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:

[csharp]
class car {
int wheels = 4;
string engine;
}
car mybike = new car();
mybike.wheels = 2;
mybike.engine = null;
[/csharp]

Niby kod prawidłowy, kompilator nie będzie marudził ale…
… skąd biedny programista ma wiedzieć, że:
[csharp]
var someCar = mybike;
[/csharp]

w zmiennej someCar tak naprawdę jest rower? Taki kod może kusić napisanie takiego potwora:
[csharp]
var isBike = false;
if(someCar.wheels == 2 && someCar.engine == null){
isBike = true;
}
…. a potem to już tylko gorzej
[/csharp]

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.