函数/方法的后置条件

时间:2011-03-16 10:35:12

标签: c# java c++ math documentation

你们有没有人记录过前后条件下的函数或方法? (我问,因为我的老师说这是正式/正确的方式):

传说:(因为我无法输入特殊字符) 3 - 将其读作“存在”和“存在” E - 是(如在集合中)的成员 A - 为所有人 - > - 暗示

假设s是非空字符串。设B(s)是给出字符串s中位置索引的整数集 这里开始记录这个函数:

int FirstOccurence(String s, Char c)   
precondition: 
  (s.lenght() > 0) && 3 int i in B(s) [s.charAt(i) == c]    

这是等待后置条件的先决条件;)

postcondition: 
  (FirstOccurence(s,c) E B(s)) && (s.charAt(FirstOccurence(s,c)) == c) && 
     A int i B(s)[(i < FirstOccurence(s,c)) --> !(s.charAt(i) == c) ]  

您是否曾经遇到过在现实世界中记录功能/方法的方式?

5 个答案:

答案 0 :(得分:3)

烨。我遇到过它,虽然这不是行业中的常规做法。

在某些情况下,肯定会将最佳做法视为正式指定preconditionspostconditionsinvariants。例如:

如果您想要一个关于Eiffel语言如何支持按合同设计的示例,请查看here


顺便说一句,倒退的E代表'存在'而倒置A代表'为所有人'是标准的数学符号,如果你完成了大学数学一年级课程,你会遇到它们。 (可以说)有点不幸的是,人们使用的正式方法是善意或符号。它不必要地推迟/吓跑绝大多数(通常)对数学感到不舒服的程序员。

答案 1 :(得分:1)

我也在大学里使用它,并在记录一些我认为有用的功能时使用它。

在“真实”世界中,并不常见(总的来说,人们没有那么多文档)。

我认为任何文档都是好的,并且在函数之前和之后输入/输出参数的状态不是很清楚的情况下,前置条件和后置条件是可行的方法。

顺便说一句,在HTML中,您可以使用&exist; - &gt; ∃&forall; - &gt; ∀和其他一些字符实体:http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

答案 2 :(得分:0)

Spec#文件的发布条件如下:

static void Main(string![] args)
    requires args.Length > 0
{
    foreach(string arg in args)
    {
        Console.WriteLine(arg);
    }

答案 3 :(得分:0)

我以正式方式编写了前后条件和类不变量。当没有批判性的大众理解正式表示法时,就会出现问题。

我必须承认,理解A i in B(s): i < FirstOcc --> s[i] != c而不仅仅是s has no occurence of c before firstOccurence(s,c)需要更长的时间。

形式主义只在

时才有用
  1. '直观'对功能的理解变得太难了。然后,您只能依靠正式的方法来证明正确的实现或使用。
  2. 需要自动验证
  3. 看看例如sgi/stl文档。他们也使用半正式的符号,而且我经常看到人们在努力去理解这样记录的函数的含义。

答案 4 :(得分:0)

Cofoja(Java合同)通过使用注释提供类似于Eiffel的合同。

  @Requires({
    "h >= 0",
    "h <= 23"
  })
  @Ensures("getHour() == h")
  void setHour(int h);