131得票14回答
使用断言还是异常进行设计合约?

在按照契约式编程时,一个函数或方法会首先检查其前置条件是否已满足,然后才会开始处理自己的职责,对吗?目前最常用的两种检查方法是通过assert和exception实现的。 assert只在调试模式下失败。要确保其关键是(单元)测试所有单独的合同前提条件,以查看它们是否实际上失败了。 exc...

68得票18回答
足够的空值检查是多少?

在哪些情况下不需要检查 null?最近我一直在处理一些遗留代码,里面到处都是过多的空值检查。对于琐碎的函数、声明非空返回的 API 调用等都进行了空值检查。在某些情况下,这种空值检查是合理的,但在许多地方,空值并不是一个合理的期望。我听到了许多观点,从“你不能信任其他代码”到“始终以防御性编程...

54得票11回答
如何判断一个方法是否可能返回空值(null)

在发布这个问题和阅读那个问题之后,我意识到了知道一个方法是否应该返回null或者是否被视为错误条件并抛出异常非常重要。还有一个很好的讨论是何时需要返回“null”或抛出异常。 我正在编写一个方法,我已经知道我想要返回null还是抛出异常,最好的表达决策的方式是什么,换句话说,如何记录我的合同...

54得票5回答
在Python中使用契约式设计

我想在工作中的大量基于Python的项目中开始使用DBC,并想知道其他人使用它的经验。到目前为止,我的调研结果如下: http://www.python.org/dev/peps/pep-0316/ - PEP 316旨在为Python标准化设计契约,但已被推迟。该PEP建议使用文档字符串...

52得票7回答
ReSharper - 使用 Microsoft.Contracts 时可能存在空值赋值问题

有没有办法告诉ReSharper,由于Design-by-Contract要求检查,null引用不会发生?例如,以下代码将在ReSharper的第7和第8行引发警告(Possible 'null' assignment to entity marked with 'NotNull' attri...

52得票8回答
单元测试 - 在合同更改时进行单元测试的好处是什么?

最近我和一位同事就单元测试问题进行了有趣的讨论。我们在讨论当你的合同改变时,维护单元测试会变得不那么高效。 或许有人能够为我提供一些如何解决这个问题的启示。让我详细说明一下: 假设有一个类,它执行一些巧妙的计算。合同规定它应该计算一个数字,或者在某些情况下无法计算时返回-1。 我有合同测...

48得票3回答
Contract.Requires的用法

这是我的问题。我非常喜欢通过契约设计来开发库,尤其是可以被其他开发人员使用的库。我刚刚发现了一种新的方法,那就是使用Contract.Requires而不是Exception: public void SomeMethod(string name){ if(name==null) thr...

47得票10回答
Java有哪些好用的设计契约库?

几年前,我曾对Java的设计按契约编程(DbC)软件包进行了调查,但是我对它们中的任何一个都不太满意。不幸的是,我没有记录下详细的研究结果,而且我认为现在情况已经发生了变化。是否有人愿意比较和对比Java中的不同DbC软件包呢?

47得票9回答
为什么相比测试驱动开发,基于契约的设计不那么流行?

你可能认为这个问题与之前在StackOverflow上提出的this问题相似。但我试图以不同的角度看待事物。 在TDD中,我们编写包括不同条件、标准和验证代码的测试。如果一个类通过了所有这些测试,我们就可以放心使用它。这是一种确保类实际执行其预期任务且不执行其他任务的方式。 如果您遵循Be...

40得票3回答
C++17中提出的合约是什么?

我在B. Stroustrup的Thoughts about C++17中读到了关于合同的内容,并协助做了一个小演示,但我不确定我是否真正理解了它们。 因此,我有一些疑问,如果可能的话,能否用一些例子来说明: 合同只是经典assert()的更好替代品吗?它们应该一起使用吗?以软件开发人员...