6
|
Michael Aaron Safyan · 技术社区 · 14 年前 |
![]() |
1
3
当然,这要看情况,但我认为程序员必须知道如何编写不易出错的代码,以及在哪些地方可以通过构造进行更正。 一个例子是“向前看”的概念,例如在解析中,下一个输入标记不是“读”,然后是“看”,如果是的话可能是“放回去” 不 什么是需要的,但更确切地说是“看”然后可能“接受” 是 想要什么。例如,当编写循环遍历数据库记录和提取小计的循环时,透视图中的这种简单更改可以导致更简单、更可靠的代码。 另一个例子是 differential execution ,这是我多年前偶然发现的一种技术。它似乎允许以增量方式重新执行任何算法,以便以增量方式更新其结果。我在用户界面中广泛使用它,其中的内容可以动态更改。很长一段时间以来,我觉得它在所有情况下都有效,但不确定,直到我最终证明了它, as at the bottom of my Wikipedia page . 在那之后,我知道如果我坚持一些简单的约束,我可以依赖它来工作,不管代码有多依赖它。 同时,我们可能对某些算法的正确性有最大的信心,但由于我们的证明技术很差,发现很难进行形式化证明。想想那些低级的泡沫。很明显,它是有效的,但是试着通过对源代码应用规则来正式地证明它。我做过,但它是 不 容易的。我没有尝试过更先进的排序算法。 |
![]() |
2
5
教授要我用循环不变量证明循环; 你的教授想确保你理解循环不变量,而不仅仅是证明一个非常简单的函数。 在这种情况下,真的需要循环不变量作为正确性的证明吗? 好吧,从技术上讲,不是。根据这个推理,你也不需要写一个阶乘函数:只要使用一个库函数!但这不是练习的重点。 在循环不变量(以及适当的初始化和终止条件)成为证明正确性所必需的条件之前,循环必须有多复杂? 我认识一些聪明人 任何东西 如果没有不变量,那么就有人需要使用它们,即使是像上面这样的小情况。这就像问“在你需要手推车来移动石头之前,它必须有多重?”. 另外,我想知道…这种正式的证据在这个行业里多久使用一次? 写得很清楚?可能很少,除非你在 certain industries . 但我在写除了最简单的循环之外的任何循环时都会考虑它们。 这有点像我不画句子图,但这并不意味着我从不考虑语法,尤其是当我写一些非常重要的文本时。我可以告诉你我的代词的先行词是什么,尽管我从不费心把这个事实写在纸上。 |
![]() |
3
1
当你在解决棘手的问题和编写代码,这些代码将在你继续工作很长一段时间后被重用时,你(应该)每天都要经历证明你所编写的每一个例程正确性的过程。测试驱动开发是这个想法的一种形式化,但它的核心是:你至少需要向自己证明,最好向他人证明(代码审查!)您编写的代码将以适当的方式处理所有可能的输入和路径。 我们是否在代码不变量上争论不休?不,在你登记入住之前,我们会评分吗?某种程度上。如果团队对您的代码或“证明”不满意,您可以返回到您的框中进行修复,直到它通过审查。 |
![]() |
4
0
近年来,以各种名称命名的“测试驱动开发”是大多数人最费心去推理的代码。与逻辑推理相比,这更像是非常谨慎和可重复的实验。科学与数学! 在像埃菲尔这样的语言中,有一些使用了前置条件、后置条件和循环/类不变量,而.net 4.0中即将推出的“契约”支持可能有助于进一步普及这些思想。 就我个人而言,这些天我很少使用断言;当我在一个结构中循环时,我通常不再将其作为循环来编写。我把它写成一个查询,比如用c语言编写linq,或者用js等其他语言编写类似的东西。因此,没有必要进行状态操作来出错(通常没有)。任何关于结果的断言都是多余的,因为它只需重申查询中的条件:在查询方法中,您可以描述所需的结果。 这并不是说我从不使用断言;但我倾向于将它们与单元测试结合使用,并且只用于执行集合的一些复杂的“就地”变异的非常复杂的算法;在这种情况下,没有“内置”的方法来要求得到我想要的结果;我必须编写该算法是必需的(可能是因为复制整个数据结构会非常昂贵),所以我用断言来覆盖它,以便帮助我的单元测试标记出内部问题。 |
![]() |
John V · 是否存在单元测试无法发现的逻辑/流错误类型? 6 年前 |
![]() |
Beefster · 为什么ANSI颜色转义以“m”而不是“]”结尾? 7 年前 |
![]() |
Guillermo Gutiérrez · STR转换是如何工作的? 7 年前 |
![]() |
RudziankoÅ · 合并排序数组算法 7 年前 |
|
user8852560 · 构造函数中的验证和构造函数冲突 7 年前 |
![]() |
jav974 · 订购产品时寻找最佳价格组合的算法 7 年前 |
![]() |
hippietrail · 确定浮点数中前导零的数量 7 年前 |