Answers:
不变的概念与“副作用”密切相关。我相信它是由Bertrand Meyer的“按合同设计(DbC)设计”方法促进软件设计的。
DbC通过3个重要的概念,前提条件,后置条件和不变量来丰富抽象数据类型(类的主干)。在引用过程时,它很容易解释,因此,我将尝试对其进行解释:
甲前提表示条件输入数据的程序必须以调用该程序的尊重。该特定过程的客户必须遵守并执行此先决条件。但是,过程设计者可以通过将条件声明为过程中的第一行来抵御那些不尊重前提条件的客户端。例如,拥有一个方法double divide(double dividend, double divisor)
的前提可能是divisor != 0
。
甲后置条件表示在过程返回后的输出数据的条件; 只要遵守前提条件,流程设计者的全部工作就是尊重该前提条件。在返回之前可以以防御编程风格进行声明,可以声明后置条件。
一个不变量可以被看作是双方的先决条件和后置条件,但是从上述概念的先决条件和后置条件不同的理解。不变式基本上说,如果输入具有在调用过程之前满足的特定条件,则该特定条件在调用过程之后才有效。例如,过程的有效不变量boolean search(int term, int array[])
可能表示array
调用之前的状态与调用之后的状态相同。
在过程(不仅是过程)上执行不变式是一件好事,因为它可以减少副作用。这是有用的,因为副作用在编程中是一个极大的弊端。特定过程可能会更改输入自变量的状态,或更改某些全局变量的状态,或依赖于某些全局变量。这可能会导致令人讨厌的情况,其中在相同过程(具有相同输入)上的两个相同调用可能会产生不同的输出。这导致了解调用的历史记录,并且很难调试,尤其是在多线程上下文中。
据我所知,不变性的重要性来自这样一个事实,即它是证明算法确实可以计算特定功能的基础。例如,您已经开发了一种新的排序算法,但是如何确保它确实对每个输入或每个正确的输出进行排序。下一步是构造与算法流程相对应的不变量,并证明它使用不变量进行排序。