C# 函数/方法的后置条件
你们中有没有人用前后条件记录过函数或方法?(我这样问是因为我的老师说这是正式/正确的方法): 图例:(因为我无法键入特殊字符) 3-将其理解为“存在”&存在C# 函数/方法的后置条件,c#,java,c++,math,documentation,C#,Java,C++,Math,Documentation,你们中有没有人用前后条件记录过函数或方法?(我这样问是因为我的老师说这是正式/正确的方法): 图例:(因为我无法键入特殊字符) 3-将其理解为“存在”&存在 E-是(如集合中)的成员 A-适用于所有人 -->-暗示 假设s是一个非空字符串。设B(s)是一组整数,它们给出字符串s中位置的索引。 以下是该函数的文档: int FirstOccurence(String s, Char c) precondition: (s.lenght() > 0) && 3 in
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]
这是先决条件等待后决条件;)
后置条件:
(firstoccurrence(s,c)eb)&&&&&&&&&&&&&&&&(s,c)firstoccurrence&=c
A int i B(s)[(i<首次出现(s,c))-->!(s.charAt(i)=c)]
你们中有人在现实世界中遇到过这样一种记录函数/方法的方法吗?是的。我也遇到过这种情况,尽管这在行业中不是正常的做法 在某些情况下,正式指定和将被视为最佳实践。例如:
- 使用时;e、 g.正式证明程序正确,或
- 当使用像Eiffel这样的编程语言时,支持
顺便说一句,倒E代表“存在”,倒A代表“所有人”是标准的数学符号,如果你上过大学一年级的数学课,你就会遇到它们。人们使用的形式化方法是种类或符号,这(可以说)有点令人遗憾。它不必要地吓跑了绝大多数(通常)对数学感到不舒服的程序员。我在大学里也用过它,在记录一些函数时,我发现它很有用 在“现实”世界中,这并不常见(一般来说,人们不会记录太多) 我认为任何文档都是好的,在函数前后输入/输出参数的状态不是很清楚的情况下,先决条件和后决条件是最好的选择 顺便说一下,在HTML中,您可以使用
&exist代码>-->∃ <代码>&forall代码>-->∀ 以及其他一些字符实体:记录post条件,如下所示:
static void Main(string![] args)
requires args.Length > 0
{
foreach(string arg in args)
{
Console.WriteLine(arg);
}
我以正式的方式编写了前置条件和后置条件以及类不变量。当没有理解形式符号的临界质量时,问题就出现了
@Requires({
"h >= 0",
"h <= 23"
})
@Ensures("getHour() == h")
void setHour(int h);
我必须承认,我花了更长的时间去理解B(s)中的A I:Is[I]!=c
不仅仅是:s在第一次出现(s,c)之前没有出现c
形式主义只有在
@Requires({
"h >= 0",
"h <= 23"
})
@Ensures("getHour() == h")
void setHour(int h);
@需要({
“h>=0”,
“请你指出一些链接,代码示例好吗?这个概念对我来说很模糊。有价值的一课:代码读的次数比写的要多。因此,任何提高阅读能力的东西都可能会对编写部分产生一些影响。这种文档在(不久的)将来是值得的。@Gamecat所以你说的是“这”(前提条件)以目前的形式更容易理解:如果c不在s中,则返回c在s中的第一次出现或零?@X如果我完全同意你的观点,那并不是我害怕数学,正如Stephen c.所建议的那样(我大学一年级的成绩都是A)但问题是,阅读和理解完全不是直观的。我确实看到这种只在极少数FNC中描述前/后条件的方法的价值,这将是难以用语言描述的。