合同设计与防御性编程之间的差异


Answers:


30

在某种意义上,按合同进行设计和防御性编程是相反的:在DbC中,您定义协作者之间的合同,并在假定协作者遵守合同的前提下进行编程。在防御性编程中,您是在假定协作者违反合同的前提下进行编程的。

用DbC样式编写的实平方根例程将在其合同中声明不允许您传递负数,然后简单地假定它永远不会遇到负数。防御性写的实平方根例程将假定它已传递负数并采取适当的预防措施。

注意:在DbC中,当然有可能其他人会检查合同。例如,在Eiffel中,合同系统将在运行时检查负数并抛出适当的异常。在Spec#中,如果无法证明例程永远不会传递负数,则定理证明者将在编译时检查负数,并使构建失败。区别在于程序员不进行此检查。


7

合同设计(DbC)是否可以成为防御性编程的一种方式?

是。

“防御性编程”通常是浪费时间的借口。经常浪费时间检查会引起普通异常的事情。除了异常以外,还编写了额外的IF语句,而不是异常处理子句。

定义合同并完成合同。

当某人违反合同时,在正常情况下,该程序将中断并引发可以正常处理的异常。

可以显示“防御性编程”和“错误预防”添加错误(因为错误预防检查本身就是错误的)而不是防止错误。

异常处理可以使异常静默,记录和处理异常,这比“防御性编程”要好得多。


6
防御性编程不仅仅是if语句。它包括代码审查,静态分析,安全审核,安全编码准则等。另外,使用异常和异常处理(而不是简单地使程序崩溃和刻录)被认为是一种防御性编程技术。
Thomas Owens

2
@ThomasOwens:听起来像“优秀的软件开发”。我只见过防御性编程被用作编写许多IF语句(或断言)的借口,这些IF语句在正常引发异常之前就失败了。我不会将您一长串真正好的想法称为“防御性编程”。我将您的好主意清单称为“编程”。这样,我们就可以将浪费时间与您列出的所有智能事物分开。
S.Lott

2
我更喜欢自己称这些“编写代码时的好主意”,但是当我学习防御性编程时,我被告知它涉及任何和所有技术,其明确目的是确保系统的安全性,安全性和可靠性。 。也许这是一个过于宽泛的定义,或者是一个错误的定义,但这就是我所教的。我见过人们称if语句和断言为“防御性编程”,但是根据我所教的定义,我不会这样称呼(除非您不一定有更好的选择,例如例外)。
Thomas Owens

@ThomasOwens:“也许这是一个过于宽泛的定义”。同意。似乎是一个很棒的好主意清单。
S.Lott

2
-1:我不知道DbC是如何进行防御性编程的方法,它们基本上是相反的。我怀疑只是为了浪费时间而进行防御性编程是很常见的。而且“可以证明会增加错误”需要引用,因为它一点都不明显。
标记
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.