我认为不行。
因为我不认为 6.d“本地实现了大多数 DbC 特性”,对于“大多数”的合理定义,我已经从维基百科的设计契约页面中将其删除。
(如果您认为尽管有上面和下面的 SO 和我的注释,它应该被放回到本地部分,请确保它按字母顺序出现。)
我认为:
P6 有原材料,可重复使用以“实现大多数 DbC”。
一个自然的开始是一个用户空间模块。(然后自然适合维基百科页面,但在具有第三方支持的语言部分中。)
以下是我所思考的草图。
1. 在例程组合/继承/委托的上下文中,对前置条件进行 OR 运算和对后置条件/不变量进行 AND 运算:
实现一种动态调用(或者只是静态引用)仅“相关祖先”例程的 PRE
语句/块以及单独的 POST
语句/块的方法。
确定“相关祖先”。对于不涉及多重分派的类层次结构(或对象委托链),通过 callsame
机制很容易确定“相关祖先”。但在一般情况下,由于多重分派的非常不同的范例,可能会有许多“竞争”的候选者,这感觉非常不同。它们都是“相关祖先”,因此将它们所有的 PRE
和 POST
条件组合起来是否合适?我目前认为不是。
修改例程选择/分派。参见例如 OO::Actors
,了解如何以最高效的方式进行修改的模板。目标是根据 DbC 规则,将获胜例程及其“相关祖先”的 PRE
语句/块逻辑 OR 在一起,并且 POST
语句/块逻辑 AND。
支持 类 级别的 PRE
和 POST
块。可以在类中编写 PRE
和 POST
块,但它们与类的构造相关联,而不是随后对类内方法的调用。对于后者,以下 S04 speculation 似乎是正确的方法:
查看Block Phasers,特别是PRE
和POST
phasers。我没有使用过它们,而且距离我读Eiffel书已经有25年了,但它们看起来很合适。
PRE
和POST
phasers在S04-phasers/pre-post.t中进行了测试。我至少看到一个bug TODO。
如果您能查看文档,尝试使用在线P6评估器进行实验,并回报给我们您的想法,我们将不胜感激。请告诉我们是否遇到了TODO的错误或其他任何问题,以便我们决定如何处理:
维基百科页面中说它列出了“实现大多数DbC功能的语言”。可以想象,“大多数”这个限定词是主观的。P6是否本地实现了所有(或“大多数”)DbC功能?如果没有,那么它可能需要从维基百科页面中删除。
除非我们决定P6 DbC声明是虚假的,否则我们可能需要将'DbC'和'Design by Contract'添加到文档和文档索引中。(可能您搜索了其中之一或两者,没有找到匹配项,这就是导致您认为找不到它们的原因,对吧?)
无论官方是否认为PRE
和POST
是DbC功能,我们也需要为它们提供示例。但是,我们已经知道P6拥有强大的功能,但其中许多功能仍未记录在官方p6doc的一部分,尽管许多人都在贡献。还有很多工作要做!如果您能够提供几个真正好的、简单的使用PRE
和POST
的示例,可能是从您在烤测试中看到的内容开发而来,那将是非常棒的。:)