我目前正在研究代码合同,并不完全确定Contract类的静态方法是否足以与条件的数学符号竞争。
假设我们有一个简单的阶乘方法:
int Factorial(int n);
我将表达以下条件:
Precondition:
n >= 0
Postconditions:
Factorial(n) = 1, in case n = 0
Factorial(n) = n*(n-1)*...*1, in case n > 0
这些条件清晰地规定了阶乘的行为方式。我的问题是,它们是否可以通过代码合同来表达。
前置条件很简单:
Contract.Requires(n >= 0)
条件后置条件可以使用以下方式表示:
if(n==0)
Contract.Ensures(Contract.Result<int>() == 1);
if(n > 0)
...
但我不喜欢在这里使用“if”语句,因为它使得前置和后置条件的普通列表变得更难以阅读。我希望我们有类似以下的内容:
Contract.Ensures(...).InCase(...);
最后但同样重要的是,我不知道该如何表达这个关于数学的普遍符号:
n*(n-1)*...*1
我想我需要一些循环的方式,但这样会复制整个实现。有没有聪明的方法来表达这样的符号?
提前感谢你。