在埃菲尔确保条款

时间:2013-05-26 03:14:07

标签: eiffel

我正在埃菲尔做作业,而我在执行我的保证条款时遇到了麻烦。是否需要包含变量或函数的特殊语法?

这是我的'put'功能

目前的代码
    put(key: K; value: V)
    require

            key /= void
    local
        tmp:ITEM[K,V]
    do

        create tmp.make(key, value)
        list.put_front (tmp)
        count := count + 1
    ensure

    count = old count + 1 and list.has(key, value)
    end

这是'has'功能的代码

    has(key:K; val:V):BOOLEAN
require
    key /= void
local

    flag: INTEGER
    do

    flag := 0
    from
        list.start
    until
        list.exhausted
    loop
        if list.item.getkey = key then
            if list.item.getvalue = val then
                flag := 1
            end
        end
        list.forth
    end
    if flag = 1 then
        Result := true
    else
        Result := false
    end
    ensure
        --???   
end

作业是通过链接列表实现地图adt。 'put'函数将项(键,值)插入列表中。 'has'函数检查列表是否包含(键值)对。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

可能只是

Result = across list as c some (c.item.key = key and c.item.value = value) end

但是对代码还有其他一些评论:

  1. 我没有看到使用属性key /= Void的位置。所以它看起来不是必需的。
  2. 鉴于put的代码插入ITEM类型的元素,put的后置条件也应使用across list ... end而不是list.has (key, value)。所以我怀疑它应该只是has (key, value)而不是list.
  3. 我没有看到使用辅助变量flag的任何意义。保留变量Result也可以。
  4. Eiffel中的所有变量都是按默认值初始化的,因此无需在简化版中将0分配给flag(或falseResult在例行公事的开始。
  5. 通常不需要在Eiffel中使用专门的getter,因此通常代码list.item.getkey看起来像list.item.key
  6. 可以通过调用list.finish来抢先退出循环,list.forth在找到所需元素时将光标移动到列表的最后一项。然后在{{1}}之后满足循环退出条件并且循环终止。