Что такое инвариант класса в ООП?

Ответ

Инвариант класса — это логическое условие или набор условий, которые должны оставаться истинными для любого экземпляра класса на протяжении всего его жизненного цикла. Он гарантирует, что объект всегда находится в корректном, согласованном состоянии.

Инвариант должен выполняться после завершения работы конструктора и сохраняться до и после вызова любого публичного метода, который изменяет состояние объекта.

Пример: Класс банковского счета

Инвариант: баланс никогда не может быть отрицательным.

class BankAccount:
    def __init__(self, initial_balance: float):
        # Проверка инварианта при создании объекта
        if initial_balance < 0:
            raise ValueError("Initial balance cannot be negative")
        self._balance = initial_balance

    def withdraw(self, amount: float):
        # Проверка условия перед изменением состояния
        if self._balance - amount < 0:
            raise ValueError("Insufficient funds")
        self._balance -= amount
        # После выполнения метода инвариант (self._balance >= 0) сохраняется

    def get_balance(self) -> float:
        return self._balance

Ключевые моменты:

  • Гарантия корректности: Инварианты защищают объект от перехода в недопустимое состояние.
  • Место проверки: Устанавливается в конструкторе (__init__) и поддерживается всеми методами, изменяющими состояние.
  • Отладка: Нарушение инварианта явно указывает на ошибку в логике класса. В Python для отладки часто используют assert для проверки инвариантов.