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

180
19 сентября 2018, 10:50

Очень часто в статьях по ООП встречается такое слово, как инвариант:

  • ...не позволяет модели обеспечивать собственные инварианты
  • убедиться в выполнении предусловия можно исходя из постусловий и инвариантов предшествующих вызовов
  • Это кстати называется принципом инварианта. собственно инкапсуляция и позволяет сохранять инвариант.
  • То есть независимо от одновременного количества потребителей, она будет сохранять свои инварианты и придерживаться контракта.
  • У каждого агрегата есть корень (Aggregate Root) и граница, внутри которой всегда должны быть удовлетворены инварианты.

Что имеется ввиду под этим термином? Как выглядят инварианты в коде?

Я нашёл описание термина "инвариант цикла":

Инвариант цикла – это соотношение, которое истинно перед циклом, истинно в процессе выполнения цикла и истинно при выходе из цикла. Все это описано у Дейкстры в книге «Дисциплина программирования», и детально разжевано у Гриса в книге «Наука программирования».

А хотелось бы понять, что понимают под инвариантом

  1. в программировании по контракту и
  2. чистом ООП (я так понял, это имеет отношение к инкапсуляции)
Answer 1

Инвариант в математике - это выражение которое сохраняет свое значение. В программировании инвариантом также называют предикат который всегда истинный.

Таким образом, инвариант объекта в ООП - это либо (чаще) условие которое остается истинным после вызова любых методов объекта в любой последовательности, либо (реже) выражение которое сохраняет свое значение после вызова любых методов.

В коде инварианты чаще всего никак не выражены, но иногда ставятся защитные проверки которые их проверяют.

Примеры инвариантов.

List<>: 0 ≤ _size ≤ _items.Length

List<>.Enumerator: list.version = const = version; есть защитная проверка

List<>.Enumerator: 0 ≤ index ≤ list._size+1

ArraySegment<>: Array == null && Offset == 0 && Count == 0 || Array != null && 0 ≤ Offset && 0 ≤ Count && Offset + Count ≤ Array.Length; этот инвариант представлен в коде в виде конструкции Contract.Assert

Answer 2

Инварианты в коде обычно выглядят:

  1. Как транзакции - какие то изменения, которые либо прошли целиком, либо целиком откатились.

  2. Как валидации перед сохранением - которые либо дали сохранить изменения, либо упали с ошибкой о некорректном состоянии.

  3. В целом, любое исключение может оказаться следствием поддержки инварианта - обеспечение целостности, частный случай - ObjectDisposedException.

  4. Функциональные программы часто инвариантны, т.к. не меняют состояние исходного объекта.

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

Answer 3

Инвариант в объектно-ориентированном программировании — выражение, определяющее непротиворечивое внутреннее состояние объекта. (Википедия: Инвариант)

READ ALSO
Нужно написать программу, для вычисления [закрыт]

Нужно написать программу, для вычисления [закрыт]

Есть форма, в которой находятся 3 textbox'a , 6 radioButton'ов и 1 buttonПорядок действий такой:

181
Replace отложенная инициализация

Replace отложенная инициализация

Есть исходная строка, слова в которой необходимо заменять на результаты выполнения методовСоответственно, если заменять нечего, то и метод...

171
Ошибка при добавлении символа

Ошибка при добавлении символа

На форме есть текстбокс, при добавлении в него символа, должен был добавляться спецсимвол, в моём случае "|", но у меня появляется ошибка:

163