Введение
Неизменное свойство для всех объектов класса – концепция компьютерного программирования.
the computer programming concept
В компьютерном программировании, особенно в объектно-ориентированном программировании, инвариант класса (или инвариант типа) – это условие, используемое для ограничения допустимых состояний объектов класса. Методы класса должны обеспечивать сохранение этого инварианта. Инвариант класса ограничивает состояние, хранящееся в объекте. Инварианты класса устанавливаются при создании объекта и постоянно поддерживаются между вызовами публичных методов. Код внутри функций может временно нарушать инвариант, но должен восстановить его до завершения работы публичного метода. При работе с многопоточностью, поддержание инварианта в методах обычно требует использования критической секции, реализуемой посредством блокировки состояния с помощью мьютекса. Инвариант объекта, или инвариант представления, – это конструкция в программировании, представляющая собой набор условий, которые остаются неизменными независимо от состояния объекта. Это гарантирует, что объект всегда будет соответствовать заданным условиям, и что методы могут безопасно ссылаться на объект, не рискуя делать неверные предположения. Определение инвариантов класса может помочь программистам и тестировщикам выявлять больше ошибок в процессе тестирования программного обеспечения.
Инварианты класса и наследование
Полезный эффект инвариантов класса в объектно-ориентированном программном обеспечении усиливается при наличии наследования. Инварианты класса наследуются, то есть "инварианты всех родительских классов применяются к самому классу". Наследование может позволить дочерним классам изменять данные реализации родительских классов, поэтому дочерний класс мог бы изменить состояние экземпляров таким образом, чтобы они стали недействительными с точки зрения родительского класса. Беспокойство по поводу подобного некорректного поведения дочерних классов – одна из причин, по которой разработчики объектно-ориентированного программного обеспечения предпочитают композицию наследованию (то есть наследование нарушает инкапсуляцию). Однако, поскольку инварианты класса наследуются, инвариант класса для любого конкретного класса состоит из любых инвариантных утверждений, непосредственно определенных в этом классе, в сочетании со всеми инвариантными условиями, унаследованными от родительских классов. Это означает, что, хотя дочерние классы могут иметь доступ к данным реализации своих родителей, инвариант класса может помешать им манипулировать этими данными таким образом, чтобы создать недействительный экземпляр во время выполнения.
Утверждения
Общие языки программирования, такие как Python, PHP, JavaScript, C++ и Java, поддерживают утверждения по умолчанию, которые можно использовать для определения инвариантов класса. Распространенный способ реализации инвариантов в классах — это выбрасывание конструктором класса исключения, если инвариант не выполняется. Поскольку методы поддерживают инварианты, они могут исходить из предположения об их истинности и не обязаны явно их проверять.
Поддержка местных
Инвариант класса — важный компонент разработки по контракту. Следовательно, языки программирования, обеспечивающие полную нативную поддержку разработки по контракту, такие как Eiffel, Ada и D, также будут обеспечивать полную поддержку инвариантов класса.
Неродная поддержка
Для C++, библиотека Loki предоставляет основу для проверки инвариантов классов, инвариантов статических данных и обеспечения безопасности исключений. Для Java существует более мощный инструмент под названием Java Modeling Language, который предоставляет более надежный способ определения инвариантов классов.