很多时候在 OOP 的文章中有一个词是不变的:
- ...不允许模型提供自己的不变量
- 您可以根据先前调用的后置条件和不变量来验证是否满足前置条件
- 顺便说一下,这被称为不变原理。实际上封装并允许您保存不变量。
- 也就是说,无论同时有多少消费者,它都将保留其不变量并遵守合同。
- 每个聚合都有一个根(Aggregate Root)和一个边界,在该边界内必须始终满足不变量。
这个词是什么意思?不变量在代码中是什么样的?
我找到了术语“循环不变”的描述:
循环不变量是在循环之前为真、在循环执行时为真、在循环退出时为真的关系。这一切都由 Dijkstra 在《编程学科》一书中描述,并由 Gris 在《编程科学》一书中详细解释。
我想了解不变量是什么意思
- 在合同编程和
- 纯OOP(据我了解,这与封装有关)
数学中的不变量是保留其值的表达式。在编程中,不变量也称为始终为真的谓词。
因此,OOP 中的对象不变量要么(更常见)是在以任何顺序调用对象的任何方法后保持为真的条件,要么(不太常见)是在调用任何方法后保留其值的表达式。
在代码中,不变量通常不以任何方式表示,但有时会设置保护性检查来检查它们。
不变量的例子。
List<>
: 0 ≤ _size ≤ _items.LengthList<>.Enumerator
: list.version = 常量 = 版本;有一个安全检查List<>.Enumerator
: 0 ≤ 索引 ≤ list._size+1ArraySegment<>
: 数组 = null && 偏移量 = 0 && 计数 = 0 || Array != null && 0 ≤ Offset && 0 ≤ Count && Offset + Count ≤ Array.Length; 这个不变量在代码中表示为 Contract.Assert 构造代码中的不变量通常如下所示:
作为事务 - 一些完全或完全回滚的更改。
就像保存前的验证一样 - 它可以让您保存更改,或者因状态不正确而出错。
一般来说,任何异常都可能是维护不变量的结果——完整性保证,一种特殊情况——ObjectDisposedException。
函数式程序通常是不变的,因为 不要改变原始对象的状态。
只有对象本身才能更改的对象的私有字段,加上每个公共方法将它们从工作且一致的状态更改为工作且一致的状态。
面向对象编程中的不变量是定义对象的一致内部状态的表达式。(维基百科:不变)