我目前正在玩代码合同,我不完全确定合同类的静态方法是否强大到足以与条件的数学符号竞争。
假设我们有一个简单的阶乘方法
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
这些条件以简洁明了的方式清楚地指定了 Factorial 的行为。我的问题是,它们是否可以通过代码合同来表达。
前提是微不足道的:
Contract.Requires(n >= 0)
条件后置条件可以用
if(n==0)
Contract.Ensures(Contract.Result<int>() == 1);
if(n > 0)
...
但我不喜欢这里需要“if”语句的方式,因为它使前置条件和后置条件的简单列表更难阅读。我希望我们会有类似的东西
Contract.Ensures(...).InCase(...);
最后但并非最不重要的一点是,我不知道如何表达这一点,这是关于数学的常见符号:
n*(n-1)*...*1
我猜我需要某种循环,但这会复制整个实现。有什么聪明的方法来表达这样的符号吗?
先感谢您。