Cóż, rzeczy, które widzę w tym wątku, są świetne, ale mam definicję „niezmiennika”, który był dla mnie niezwykle pomocny w pracy.
Niezmiennikiem jest każda logiczna reguła, której należy przestrzegać podczas wykonywania programu, którą można przekazać człowiekowi, ale nie kompilatorowi.
Ta definicja jest pomocna, ponieważ dzieli warunki na dwie grupy: te, którym można zaufać kompilatorowi, oraz te, które należy udokumentować, omówić, skomentować lub w inny sposób przekazać współautorom, aby mogli wchodzić w interakcje z bazą kodu bez wprowadzania błędów .
Również ta definicja jest pomocna, ponieważ pozwala na zastosowanie uogólnienia „Niezmienniki są złe”.
Na przykład dźwignia zmiany biegów w samochodzie z manualną skrzynią biegów została zaprojektowana tak, aby uniknąć niezmiennika. Gdybym chciał, mógłbym zbudować skrzynię biegów z jedną dźwignią dla każdego biegu. Ta dźwignia może być do przodu („załączona”) lub do tyłu („odłączona”). W takim systemie stworzyłem „niezmiennik”, który można udokumentować jako taki:
„Bardzo ważne jest, aby aktualnie włączony bieg był wyłączany, zanim inny bieg zostanie włączony. Włączenie dowolnych dwóch biegów jednocześnie spowoduje naprężenia mechaniczne, które spowodują rozerwanie przekładni. Zawsze wyłączaj aktualnie włączony bieg, zanim włączysz inny.”
I tak można winić zepsute transmisje za niechlujną jazdę. Nowoczesne samochody używają jednak jednego drążka, który obraca się między biegami. Jest zaprojektowany w taki sposób, że w nowoczesnym samochodzie z drążkiem zmiany biegów nie można włączyć dwóch biegów jednocześnie.
W ten sposób moglibyśmy powiedzieć, że skrzynia biegów została zaprojektowana do „usunięcia niezmiennika”, ponieważ nie pozwala ona na mechaniczną konfigurację w sposób naruszający regułę logiczną.
Każdy niezmiennik tego rodzaju, który usuwasz z kodu, stanowi ulepszenie, ponieważ zmniejsza obciążenie poznawcze związane z jego obsługą.