Was ist eine Klasseninvariante?
In der objektorientierten Computerprogrammierung und -gestaltung ist eine Klasseninvariante ein Satz von Regeln, mit denen definiert werden kann, ob eine Objektinstanz in einem gültigen Zustand vorhanden ist. Aus der Sicht des Designs ist eine Klasseninvariante eine Reihe von Grenzen, zwischen denen die Daten in einem Objekt liegen müssen, um in einem ordnungsgemäßen Funktionszustand betrachtet zu werden. Eine Klasseninvariante kann in der Konstruktionsdokumentation oder in Quellcodekommentaren definiert oder in einigen Programmiersprachen direkt in umsetzbaren Computercode implementiert werden. Ein Programm, das codierte Invarianten und Zusicherungen verwendet, kann dazu führen, dass das Programm die Ausführung einstellt oder verschiedene Fehler ausgibt, wenn die invarianten Bedingungen nicht erfüllt sind. Im Gegensatz zur Standardfehlerprüfung werden Klasseninvarianten im Allgemeinen nur verwendet, um sicherzustellen, dass die innere Implementierung einer Klasse funktioniert, und sie werden normalerweise nicht in der öffentlichen Dokumentation oder in Programmierschnittstellen aufgeführt.
Eine Klasseninvariante ist von Grund auf eine Ansammlung von Behauptungen für eine Klasse. Eine Zusicherung ist, wiederum in einfachen Worten, eine Anweisung, die einen Teil des Status der Klasse überprüft und als wahr ausgewertet werden muss, damit die Programmausführung fortgesetzt werden kann. Ein Beispiel für eine Zusicherung ist eine Anweisung, die sicherstellt, dass eine bestimmte Ganzzahl immer zwischen 1 und 10 liegt. Wenn eine Klasseninvariante verwendet wird, werden Zusicherungen für alle relevanten Teile der Daten ausgewertet, die im Objekt enthalten sind, und im Wesentlichen überprüft, ob alle Daten in der Objekt liegen innerhalb der definierten Bereiche.
In vielen Fällen ähnelt die Verwendung einer Klasseninvariante stark der Standardfehlerprüfung, bei der Variablen gemessen werden, um sicherzustellen, dass sie innerhalb der verwendbaren Grenzen liegen oder nicht null sind. Der Unterschied zwischen der Verwendung von Klasseninvarianten und der Standardfehlerprüfung besteht jedoch darin, dass Invarianten und Zusicherungen vorwiegend zum Erfassen von Fehlern verwendet werden, die nur dann auftreten sollten, wenn der Code einen inneren Fehler aufweist. Ein weiterer Unterschied besteht darin, dass die Standardfehlerprüfung in der Regel eine Wiederherstellung und Änderungen des Programmsteuerungsflusses zur Folge hat, während das Ergebnis eines unveränderlichen Fehlers die Programmbeendigung sein sollte. Die meisten Programme werden beendet, wenn eine Prüfung auf Klasseninvarianten fehlschlägt, weil das Objekt in einem gefährdeten Zustand ist und aus Entwurfssicht nicht in der Lage ist, die zur Einhaltung des Entwurfsvertrags erforderlichen Vor- und Nachbedingungen zu erfüllen.
Eine der Eigenschaften einer Klasseninvariante in objektorientierten Programmiersprachen, in denen sie implizit definiert ist, ist, dass die Invariante ein Mechanismus ist, der von allen Unterklassen geerbt wird. Dadurch wird verhindert, dass eine Unterklasse alle in der übergeordneten Klasse durchgeführten invarianten Prüfungen überschreibt. Letztendlich bedeutet dies, dass eine Unterklasse nicht in der Lage ist, den von der Oberklasse festgelegten Konstruktionsvertrag zu brechen, was zu unvorhersehbaren Ergebnissen oder schwer zu findenden Programmfehlern führen kann.