Чем отличается понятия инварианта и свойства (неизменного)?
( Корректно ли составлен вопрос?
В чем смысл различия инварианта и спецификации, предъявляемой к классу, который воплощает некую абстракцию из предметной области?
)
Привожу ниже примеры и, возможно, ошибочные суждения:
1) Допустим есть граф, который можно визуально отобразить разными способами (список связей, матрица вершин, перечисление цепочек). Инвариантом графа является ( или корректнее - являЮтся? ) количество вершин и ребер.
2) Допустим есть класс и некая диаграмма классов, которая описывает, что экземпляры этого класса являются персистентными. Класс, к тому же, принадлежит некой иерархии наследования, в которой уровни наследования отсчитываются натуральными числами. Тогда:
- Инвариантом класса уровня наследования 1 является неприватный интерфейс базового класса.
- Инвариантом класса уровня наследования 2 является неприватный интерфейс конкретного класса-родителя из уровня наследования 1.
3) Допустим, есть контейнер с неотсортированными элементами. Есть класс, конструктор которого принимает контейнер, и есть метод, реализующий сортировку и вызываемый в конструторе. Тогда корректно утверждать, что класс обеспечивает инвариант для отсортированного контейнера.
4) "Куча имеет свойство упорядоченности элементов по невозрастанию" (эквивалентно) "Класс, реализующий абстрактную структуру данных куча, обеспечивает инвариант упорядоченности элементов по невозрастанию"
Пожалуйста, разъясните допущенные ошибки, я сомневаюсь, что я правильно понял концепцию.
Спасибо за внимание.