【问题标题】:estudio does not check `require` when it should?estudio 什么时候不检查`require`?
【发布时间】:2020-05-05 13:27:46
【问题描述】:

Eiffel Studio 似乎满足了我的要求,即使我在项目设置中启用了这些要求。据我记得,我有时间在需求中设置一个断点......

我不明白我在这里遗漏了什么,正如您在我的示例中看到的那样,由于我在代码上具有相同的条件并且它进入 (attached {POWER_DEVICE} a_csv.device as l_dev),因此要求通过了。

【问题讨论】:

  • require TRUE 应该告诉用户关于合约的什么?

标签: eiffel design-by-contract eiffel-studio-19.12


【解决方案1】:

继承断言的一般规则如下:

  • 前提条件只能放宽;
  • 只能加强后置条件。

在特定示例中,有效的前提条件是

    True
or else
    valid_csv (a_csv) and then attached {POWER_DEVICE} a_csv.device

这通过特征的扁平形式中组合前置条件开头的关键字require和中间的require else反映出来。表达式True 被继承。这是父级中特性的前提条件。

一种可能的解决方案是将valid_csv (a_csv) 移动到父特征,并在后代中重新定义valid_csv。如果 valid_csv 对所有调用都是通用的,但第二个测试因后代而异,则最好引入一个新功能 is_known 并在父项中包含 2 个前置条件子句:

is_valid_csv: is_valid_csv (a_csv)
is_known_csv: is_known_csv (a_csv)

is_known_csv 在类 POWER_CSV_PROCESSOR 中的实现将是

is_known_csv (a_csv: ...)
    do
        Result := attached {POWER_DEVICE} a_csv.device
    end

并且POWER_CSV_PROCESSOR 中特征process 的前提条件为空。

然后调用者会做类似的事情

if processor.is_known_csv (csv) then
    processor.process (csv)
end

【讨论】:

  • 很多谢谢,每天都会发现一些I thought it was... 有没有地方可以找到require else 的语义?我写了很多次,实际上甚至没有考虑它的语义
  • @Pipo 大多数信息都可以在线获得。例如,eiffel.org 讨论了功能协定和继承。对于离线阅读,我会选择面向对象的软件构建第 2 版。它有点过时,并没有反映最新的 Eiffel 功能,如 void-safety 或 SCOOP。但是,它提供了有关面向对象编程的一般思想的良好背景,design-by-contract 等。
猜你喜欢
  • 2021-06-23
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2010-12-24
  • 1970-01-01
相关资源
最近更新 更多