Un invariante di classe è un predicato logico che deve risultare vero per ogni istanza di una classe in determinati punti dell'esecuzione: al termine della costruzione dell’oggetto e all’ingresso/uscita di ciascun metodo pubblico. È uno strumento di specifica e verifica usato nella programmazione per contratti e, più in generale, nel ragionamento sui tipi astratti di dato.[1][2]

Definizione

modifica

Sia I l’insieme delle proprietà che descrivono lo stato ammissibile degli oggetti di una classe. L’invariante di classe è una formula Inv su I che deve essere vera:

  • al termine di ogni costruttore;
  • all’ingresso e all’uscita di ogni metodo pubblico (se nessuna eccezione lascia l’oggetto in stato non valido);
  • dopo ogni operazione che modifica lo stato visibile dell’oggetto.[3]

Uso e verifica

modifica

Gli invarianti di classe:

  • documentano i vincoli sullo stato interno (ad esempio “il saldo non è negativo”, “la lunghezza memorizzata coincide con il numero di elementi”);
  • consentono prove modulari: le precondizioni e postcondizioni dei metodi sono verificate assumendo vero l’invariante;
  • possono essere verificati in vari modi: con supporto del linguaggio (per esempio costrutti di contratto), con annotazioni formali (es. JML) o con assert e test a runtime.[4]

Esempio minimo

modifica

Esempio in pseudocodice/Java‑like: un invariante richiede che il saldo non sia mai negativo.

class ContoBancario {
    private int saldo;

    /* Invariante di classe: saldo >= 0 */

    public ContoBancario(int iniziale) {
        if (iniziale < 0) throw new IllegalArgumentException();
        saldo = iniziale;
    }

    public void deposita(int x) {
        if (x < 0) throw new IllegalArgumentException();
        saldo += x;
        assert saldo >= 0; // l’invariante continua a valere
    }

    public void preleva(int x) {
        if (x < 0 || x > saldo) throw new IllegalArgumentException();
        saldo -= x;
        assert saldo >= 0; // l’invariante continua a valere
    }
}

Terminologia

modifica

In letteratura si usa anche il termine «invariante di rappresentazione» per indicare il vincolo sullo stato interno di un tipo astratto; il concetto coincide sostanzialmente con l’invariante di classe nel contesto orientato agli oggetti.[4]

Note

modifica
  1. ^ (EN) Bertrand Meyer, 11 (Design by Contract), in Object‑Oriented Software Construction, 2ª ed., Reading (MA), Addison‑Wesley, 1997, ISBN 0-13-629155-4.
  2. ^ (EN) Barbara Liskov e John Guttag, 5 (Representation Invariants), in Program Development in Java: Abstraction, Specification, and Object‑Oriented Design, Boston, Addison‑Wesley, 2000, ISBN 0-201-65768-6.
  3. ^ (EN) Bertrand Meyer, 11.7, in Object‑Oriented Software Construction, 2ª ed., Addison‑Wesley, 1997.
  4. ^ a b (EN) Barbara Liskov e John Guttag, 5, in Program Development in Java, Addison‑Wesley, 2000.

Collegamenti esterni

modifica

📚 Artikel Terkait di Wikipedia

Bertrand Meyer

programmazione orientata agli oggetti (OOP). Il suo libro Object-Oriented Software Construction è uno dei primi e più completi lavori che presentano il

Eiffel (linguaggio di programmazione)

Software, Inc. web site of the company that introduced Eiffel, was Interactive Software Engineering (ISE). (EN) Object Oriented Software Construction

Postcondizione

agli utilizzatori, e mai diminuirli. ^ Meyer, Bertrand, Object-Oriented Software Construction, second edition, Prentice Hall, 1997, p. 342. ^ Meyer, 1997

Precondizione

vincoli per il cliente, non aumentarli. ^ Meyer, Bertrand,Object-Oriented Software Construction, second edition, Prentice Hall, 1997, p. 342. ^ Meyer, 1997

Building Information Modeling

representation of a built object (including buildings, bridges, roads, process plants, etc.) to facilitate design, construction and operation processes

Ada (linguaggio di programmazione)

Introduction to Software Design and Development With Ada, Brooks Cole, 1995, ISBN 0-314-02829-3. Bo Sanden, Software Systems Construction With Examples

Rational Unified Process

del software; in particolare, esso fu descritto in termini di un metamodello object-oriented, espresso in UML. Nel RUP, il ciclo di vita del software viene