子类型的实际前提是通过(使用逻辑组合创建的OR
)的基类型的先决条件和亚型的先决条件,这使得所得的先决条件 的限制较少
子类型的实际后置条件是通过(使用逻辑组合创建的AND
)碱型的后置和一个亚型的后置条件,这使得所得的后置条件 更严格的
以下是加强前提条件和弱化后置条件的例子,因此违反了LSP(Link):
假设您的基类使用成员int.现在你的子类型要求int为正数.这是强化前置条件,现在任何在使用负数之前完全正常工作的代码都会被破坏.
同样,假设相同的场景,但基类用于保证成员在被调用后是正面的.然后子类型更改行为以允许负的int.由于不支持后置条件,因此对该对象起作用的代码(并假设后置条件为正int)现在已被破坏.
a)当重写方法削弱前提条件时,为什么它也不被视为违反LSP ,因为此方法可以使用基类型合约不可接受的参数.因此,我们不能声称违反了基本类型的合同,因此LSP也被违反了吗?
乙)为什么是不是也认为是违反LSP时覆盖的方法加强后置条件,因为客户端调用此方法将只接收的原始方法的可能结果的一个子集.因此,我们不能声称违反了基本类型的合同,因此LSP也被违反了吗?
例:
基类后置条件保证方法的返回值在范围内1-10
,但子类型将后置条件更改为仅允许返回值在范围内2-9
.现在,由于不支持后置条件,因此破坏了从此方法返回的对象的代码(并假设后置条件在一个范围内1-10
).
inheritance liskov-substitution-principle preconditions post-conditions
我正在学习如何编程,但我无法理解的一件事是 preconditions 和postconditions。
调用函数之前的 if 语句是否被视为前提条件,或者在大多数语言中是否有单独的更有效的方法?
我也在努力寻找任何我可以用我目前的编程知识理解的先决条件的例子,如果有人能证明一个简单的例子,那么我真的很感激(任何语言都可以)
programming-languages design-by-contract preconditions post-conditions
我对这种Design by Contract
方法很感兴趣.似乎preconditions
必须使用已检查的异常来强制执行它们.
但是post-conditions
,class-invariants
我认为这assertions
是首选.
我对吗?如果我是正确的,为什么允许post-conditions
和class-invariants
禁用可能被禁用的断言?不应该强制执行后置条件和不变量吗?
在这个功能:
(defn my-post
[a]
{:post (number? %)}
a)
Run Code Online (Sandbox Code Playgroud)
后置条件不会执行(或至少不会导致断言错误).我现在知道应该是:
(defn my-post
[a]
{:post [(number? %)]} ;; note the square brackets around the expression
a)
Run Code Online (Sandbox Code Playgroud)
事实上,哪个工作正常.
问题是这种情况无声地失败了,并花了一些时间来弄清楚出了什么问题.没有语法错误,运行时异常.
我想了解Clojure对此代码的处理方式,以便了解为什么Clojure没有抱怨. 宏观扩张?解构?如果没有看到方括号,代码是否会消失?
compiler-errors compilation clojure compiler-warnings post-conditions
我正在做一些有问题的作业:
您如何处理先决条件异常?
你会如何使用条件后例外?
因此,对于第一个问题,我假设必须满足前提条件才能运行函数.例如,参数不能为null,我们可以抛出异常:
if (myArg == null)
throw new ArgumentNullException("myArg");
//do work here
Run Code Online (Sandbox Code Playgroud)
但是,我无法弄清楚后置条件异常的用途是什么,以及为什么我们要在这种情况下抛出异常(例如,如果不满足条件,则不要返回false).
有人可以为此提供一个例子吗?
我正在阅读有关使用关键字验证方法前置条件和后置条件的Oracle 文档。assert
该文档说,可以使用assert
关键字来验证public
方法的后置条件,但您应该只使用assert
关键字来验证private
方法的前置条件。
为什么是这样?
我最近的任务要求我遵守以下条件
“所有方法都有显式的后置条件,而那些具有参数前置条件的方法”
我已经阅读了一些网页,试图解释前后条件,但似乎可以理解它们,有人可以向我解释它们的含义,用法以及如何编写它们吗?
谢谢
(顺便说一句,我正在学习的语言是C#)
我正在尝试根据自己的 ada 前后条件进行学习。
有没有办法为前置和后置条件指定自定义错误/失败消息,类似于Predicate_Failure
for 谓词?我似乎无法在官方文档中找到任何内容。TIA。
design-by-contract predicate ada preconditions post-conditions
例如,我有以下代码:
public class Calc(){
final int PI = 3.14; //is this an invariant?
private int calc(int a, int b){
return a + b;
//would the parameters be pre-conditions and the return value be a post-condition?
}
}
Run Code Online (Sandbox Code Playgroud)
我只是对这些术语的确切含义感到困惑?上面的代码就是我认为的样子,但是有人能指出我的理论正确方向吗?
我正在尝试使用下面的类中的异常,但是当我调用该kivetel
方法时,程序总是失败。我认为它只会调用重试部分,而不是满足后置条件。但是它失败,并带有“ y_above_zero”后置违规。
class
KEYWORDS
create
make
feature
y:INTEGER
make
do
end
kivetel
do
ensure
y__above_zero: y > 0
rescue
y := 20
retry
end
end
Run Code Online (Sandbox Code Playgroud) 我可以理解这段代码中前置条件的含义和目的,但在理解后置条件的含义和目的方面遇到问题。我知道Push
这部分在推入整数后增加指针(Pointer = Pointer~ +1)。我理解Pop
这部分是在弹出整数后减少指针(Pointer=Pointer~ - 1)。
package Stack
--# own S, Pointer;
--# initializes S, Pointer;
with SPARK_Mode
is
pragma Elaborate_Body(Stack);
Stack_Size : constant := 100;
subtype Pointer_Range is Integer range 0 .. Stack_Size;
subtype Index_Range is Pointer_Range range 1..Stack_Size;
type Vector is array(Index_Range) of Integer;
S : Vector;
Pointer : Pointer_Range;
function isEmpty return Boolean;
--# global in Pointer;
procedure Push(X : in Integer);
--# global in out S, Pointer;
--# derives S from S, …
Run Code Online (Sandbox Code Playgroud) post-conditions ×12
ada ×3
java ×3
assert ×2
c# ×2
exception ×2
clojure ×1
compilation ×1
eiffel ×1
function ×1
inheritance ×1
liskov-substitution-principle ×1
predicate ×1
procedure ×1
rescue ×1
spark-ada ×1