Mis on klassiinvariant?

Objektorienteeritud arvutiprogrammeerimises ja -kujunduses on klassiinvariant reeglite kogum, mille abil saab määratleda, kas objekti eksemplar eksisteerib kehtivas olekus. Disaini vaatenurgast on see piiride kogum, mille vahele peavad objektis olevad andmed jääma, et neid õiges funktsionaalses olekus käsitleda. Seda saab määratleda projekteerimisdokumentatsioonis või lähtekoodi kommentaarides või mõnes programmeerimiskeeles otse rakendatavas arvutikoodis. Programm, mis kasutab kodeeritud invariante ja väiteid, võib invariantide tingimuste täitmata jätmise korral põhjustada programmi täitmise peatamise või mitmesuguseid tõrkeid. Erinevalt standardsest veakontrollist kasutatakse klassiinvariante üldjuhul ainult selleks, et tagada klassi sisemise teostuse toimimine, ning tavaliselt ei ole neid avalikus dokumentatsioonis ega programmeerimisliidestes loetletud.

Väga algtasemelt on klassiinvariant sisuliselt klassi väidete kogum. Väide, jällegi lihtsamalt öeldes, on väide, mis kontrollib mõnda klassi oleku osa ja peab programmi täitmise jätkamiseks hindama tõeseks. Üks väite näide on väide, mis tagab, et antud täisarv on alati vahemikus 1 kuni 10. Kui kasutatakse klassiinvarianti, hinnatakse väiteid kõigi objektile kuuluvate andmete asjakohaste osade jaoks, mis sisuliselt kinnitab, et kõik failis olevad andmed on objektid on määratud vahemikes.

Paljudel juhtudel sarnaneb klassiinvariandi kasutamine tugevalt standardse veakontrolliga, mille käigus mõõdetakse muutujaid, et tagada, et need on kasutatavates piirides või ei ole nullid. Erinevus klassiinvariantide kasutamise ja standardsete vigade kontrollimise vahel seisneb aga selles, et invariante ja väiteid kasutatakse peamiselt vigade tabamiseks, mis ei tohiks ilmneda, välja arvatud juhul, kui koodis on sisemine viga. Teine erinevus seisneb selles, et standardsete vigade kontrollimine kipub hõlmama taastamist ja muudatusi programmi juhtimisvoos, samas kui muutumatu tõrke tulemus peaks olema programmi lõpetamine. Põhjus, miks enamik programme lõpetatakse, kui klassi invariantide kontroll ebaõnnestub, on see, et objekt on ohustatud olekus ega suuda kujunduse seisukohast täita oma projekteerimislepingust kinnipidamiseks vajalikke eel- ja järeltingimusi.

Üks objektorienteeritud programmeerimiskeelte klassiinvariandi omadusi, milles need on kaudselt määratletud, on see, et invariant on mehhanism, mille pärivad kõik alamklassid. See takistab alamklassil alistamast mis tahes invariantseid kontrolle, mida tehakse ülemklassis. Lõppkokkuvõttes tähendab see, et alamklass ei suuda rikkuda superklassi kehtestatud projekteerimislepingut, mis võib põhjustada ettearvamatuid tulemusi või raskesti leitavaid programmivigu.