你们有没有人记录过前后条件下的函数或方法? (我问,因为我的老师说这是正式/正确的方式):
传说:(因为我无法输入特殊字符) 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) ]
您是否曾经遇到过在现实世界中记录功能/方法的方式?
答案 0 :(得分:3)
烨。我遇到过它,虽然这不是行业中的常规做法。
在某些情况下,肯定会将最佳做法视为正式指定preconditions,postconditions和invariants。例如:
如果您想要一个关于Eiffel语言如何支持按合同设计的示例,请查看here。
答案 1 :(得分:1)
我也在大学里使用它,并在记录一些我认为有用的功能时使用它。
在“真实”世界中,并不常见(总的来说,人们没有那么多文档)。
我认为任何文档都是好的,并且在函数之前和之后输入/输出参数的状态不是很清楚的情况下,前置条件和后置条件是可行的方法。
顺便说一句,在HTML中,您可以使用∃
- &gt; ∃∀
- &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)
需要更长的时间。
形式主义只在
时才有用看看例如sgi/stl文档。他们也使用半正式的符号,而且我经常看到人们在努力去理解这样记录的函数的含义。
答案 4 :(得分:0)
Cofoja(Java合同)通过使用注释提供类似于Eiffel的合同。
@Requires({
"h >= 0",
"h <= 23"
})
@Ensures("getHour() == h")
void setHour(int h);