为什么后置条件中同一表达式的当前值和 "old" 值相等?

Why current and "old" value of the same expression in a postcondition are equal?

我试图在实现之前和之后获取二维数组中条目的值。但是下面的后置条件失败了,因为这两个条目在某种程度上是相同的(是的,我已经重新定义了 is_equal,所以 ~将是对象平等):

    ensure
        designated_cell_changed:
            get_entry (row + 1, column + 1) /~ old get_entry (row + 1, column + 1)

为什么我会违反后置条件 designated_cell_changed

可能有以下几个原因:

  1. 奇怪为什么索引是row + 1column + 1而不是rowcolumn.

  2. 如果相关特征明确采用新值,例如put (value: G; row, column: ...),它应该有一个前置条件

    require
        different_value: value /~ entry (row, column)
    

    旁注: 对于查询,建议使用名词或形容词,而不是动词,因此 entry 而不是 get_entry

  3. 如果特征不接受新值作为参数,它应该自己更新相应的值。

  4. 功能代码可能有错误:

    • 它不会一直更改值(例如,在某些条件分支中)。
    • 它改变了值,但在其他一些索引处。
  5. 如果特征开始和结束的entry (row + 1, column + 1)的值不同,is_equal的实现可能会遗漏一些使对象不同的情况。