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

时间:2018-09-22 22:43:22

标签: eiffel

I'm trying to get the value of an entry in a 2D-array before the implementation and afterwards. But the following postcondition is failing because the 2 entries are somehow the same (and yes, I have redefined is_equal, so that ~ will be object equality):

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

Why do I get a postcondition violation designated_cell_changed?

1 个答案:

答案 0 :(得分:1)

可能有几个原因:

  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的实现可能会丢失某些使对象不同的情况。