Ce este un invariant de clasă?

În programarea și proiectarea computerelor orientate pe obiecte, un invariant de clasă este un set de reguli care poate fi utilizat pentru a defini dacă o instanță de obiect există într-o stare validă. Din perspectiva designului, este un set de limite între care datele dintr-un obiect trebuie să se încadreze pentru a fi considerate într-o stare adecvată, funcțională. Poate fi definit în documentația de proiectare sau în comentariile codului sursă sau, în unele limbaje de programare, poate fi implementat direct în codul computerizat acționabil. Un program care folosește invarianți și aserțiuni codificate poate face ca programul să înceteze execuția sau să arunce diverse erori atunci când condițiile de invarianță nu sunt îndeplinite. Spre deosebire de verificarea erorilor standard, invarianții de clasă sunt, în general, utilizați numai pentru a se asigura că implementarea interioară a unei clase funcționează și, de obicei, nu sunt listate în documentația publică sau interfețele de programare.

De la un nivel foarte elementar, un invariant de clasă este în esență o colecție de aserțiuni pentru o clasă. O afirmație, din nou în termeni simpli, este o declarație care verifică o parte din starea clasei și trebuie să fie evaluată la adevărat pentru ca execuția programului să continue. Un exemplu de aserțiune este o declarație care asigură că un număr întreg dat este întotdeauna între 1 și 10. Când este utilizat un invariant de clasă, aserțiunile sunt evaluate pentru toate părțile relevante ale datelor deținute de obiect, validând în esență faptul că toate datele din obiectul se află în intervalele definite.

În multe cazuri, utilizarea unui invariant de clasă seamănă foarte mult cu verificarea erorilor standard, în care variabilele sunt măsurate pentru a se asigura că se află în limitele utilizabile sau nu sunt nule. Totuși, diferența dintre utilizarea invarianților de clasă și verificarea erorilor standard este că invarianții și aserțiunile sunt utilizate în principal pentru a captura erori care nu ar trebui să apară decât dacă există o defecțiune intrinsecă în cod. O altă diferență este că verificarea erorilor standard tinde să implice recuperarea și modificări ale fluxului de control al programului, în timp ce rezultatul unei eșecuri invariabile ar trebui să fie terminarea programului. Motivul pentru care majoritatea programelor se termină atunci când o verificare invariantă a clasei eșuează este că obiectul se află într-o stare compromisă și nu poate, din punct de vedere al proiectării, să-și îndeplinească condițiile prealabile și postcondițiile necesare pentru a adera la contractul său de proiectare.

Una dintre proprietățile unui invariant de clasă în limbajele de programare orientate obiect în care sunt implicit definite este că invariantul este un mecanism moștenit de orice subclase. Acest lucru împiedică o subclasă să suprascrie orice verificări invariante care sunt efectuate în clasa părinte. În cele din urmă, aceasta înseamnă că o subclasă nu poate rupe contractul de proiectare stabilit de superclasă, ceea ce ar putea cauza rezultate imprevizibile sau erori de program greu de găsit.