Wat is een klasse-invariant?

Bij objectgeoriënteerde computerprogrammering en -ontwerp is een klasse-invariant een set regels die kunnen worden gebruikt om te definiëren of een objectinstantie in een geldige status bestaat. Vanuit een ontwerpperspectief is een klasse-invariant een set grenzen waartussen de gegevens binnen een object moeten vallen om in een juiste, functionele staat te worden beschouwd. Een klasse-invariant kan worden gedefinieerd in ontwerpdocumentatie of broncodecommentaar of kan in sommige programmeertalen direct worden geïmplementeerd in bruikbare computercode. Een programma dat gecodeerde invarianten en beweringen gebruikt, kan ertoe leiden dat het programma wordt gestaakt of dat er verschillende fouten optreden wanneer niet aan de invariante voorwaarden wordt voldaan. In tegenstelling tot standaardfoutcontrole, worden klasse-invarianten over het algemeen alleen gebruikt om ervoor te zorgen dat de interne implementatie van een klasse functioneert en worden ze meestal niet vermeld in openbare documentatie of programmeerinterfaces.

Vanaf een heel basisniveau is een klasse-invariant in wezen een verzameling beweringen voor een klasse. Een bewering, opnieuw in eenvoudige bewoordingen, is een verklaring die een deel van de staat van de klas controleert en moet evalueren op true om de uitvoering van het programma te laten doorgaan. Een voorbeeld van een bewering is een bewering die ervoor zorgt dat een gegeven geheel getal altijd tussen 1 en 10 ligt. Wanneer een klasse-invariant wordt gebruikt, worden beweringen geëvalueerd voor alle relevante delen van de gegevens in het object, in wezen validerend dat alle gegevens in de object liggen binnen de gedefinieerde bereiken.

In veel gevallen lijkt het gebruik van een klasse-invariant sterk op standaardfoutcontrole, waarbij variabelen worden gemeten om ervoor te zorgen dat ze binnen bruikbare grenzen liggen of niet nul zijn. Het verschil tussen het gebruik van klasse-invarianten en standaardfoutcontrole is echter dat invarianten en beweringen voornamelijk worden gebruikt om fouten vast te leggen die niet mogen optreden, tenzij er een intrinsieke fout in de code bestaat. Een ander verschil is dat standaardfoutcontrole de neiging heeft herstel en veranderingen in de programmastroom te omvatten, terwijl het resultaat van een invariante mislukking de beëindiging van het programma zou moeten zijn. De reden dat de meeste programma's worden beëindigd wanneer een klasse-invariante controle mislukt, is omdat het object zich in een gecompromitteerde staat bevindt en niet in staat is om te voldoen aan de voorwaarden en post-voorwaarden die nodig zijn om zich aan zijn ontwerpcontract te houden.

Een van de eigenschappen van een klasse-invariant in objectgeoriënteerde programmeertalen waarin ze impliciet zijn gedefinieerd, is dat de invariant een mechanisme is dat wordt geërfd door subklassen. Dit voorkomt dat een subklasse invariante controles die in de bovenliggende klasse worden uitgevoerd, overschrijft. Uiteindelijk betekent dit dat een subklasse niet in staat is om het door de superklasse vastgestelde ontwerpcontract te verbreken, wat onvoorspelbare resultaten of moeilijk te vinden programmafouten kan veroorzaken.

ANDERE TALEN

heeft dit artikel jou geholpen? bedankt voor de feedback bedankt voor de feedback

Hoe kunnen we helpen? Hoe kunnen we helpen?