您是否专业使用Design by Contract? 这是您从项目一开始就要做的事情,还是可以改变方向并开始将其融入您的软件开发生命周期? 您发现什么是设计方法的优缺点?

我在研究生课程中遇到了“ 按合同设计”的方法。 在学术环境中,它似乎是一种非常有用的技术。 但我目前不专业地使用Design by Contract,而且我不知道任何其他开发人员正在使用它。 听听SO群众的实际使用情况会很好。

===============>>#1 票数:14 已采纳

我不能高度推荐它。 如果你有一个采用内联文档合同规范的套件,那就特别好了,如下所示:

// @returns null iff x = 0
public foo(int x) {
  ...
}

并将它们转换为生成的单元测试,如下所示:

public test_foo_returns_null_iff_x_equals_0() {
  assertNull foo(0);
}

这样,您实际上可以看到正在运行的测试,但它们是自动生成的。 顺便说一句,生成的测试不应该检查到源代码管理中。

===============>>#2 票数:7

当您在必须相互通信的应用程序之间建立接口时,您真的可以通过合同来欣赏设计。

如果没有合同,这种情况很快就会成为一场责怪网球比赛。 团队不断来回敲响指控,浪费了大量时间。

有了合同,责任很明显。

调用者是否满足前提条件? 如果不是,客户团队需要修复它。

鉴于有效请求,接收器是否满足后期条件? 如果不是,服务器团队需要修复它。

双方是否都遵守合同,但结果不理想? 合同不足,问题需要升级。

为此,您不需要以断言的形式实现合同,您只需确保所有各方都记录并达成一致。

===============>>#3 票数:3

如果你研究STL,boost,MFC,ATL和许多开源项目,你会发现有这么多的ASSERTION语句,这使项目更安全。

设计-BY-合同! 它真的适用于真实产品。

===============>>#4 票数:3

Frank Krueger写道:

Gaius:运行时会自动抛出Null Pointer异常,在函数序言中测试这些东西没有任何好处。

我有两个回应:

  1. Null只是一个例子。 对于square(x),我想测试结果的平方根是(近似)参数的值。 对于setter,我想测试实际更改的值。 对于原子操作,我想检查所有组件操作是否成功或全部失败(实际上是一次成功测试和n次失败测试)。 对于弱类型语言的工厂方法,我想检查是否返回了正确类型的对象。 这个清单一直在继续。 基本上,任何可以在一行代码中测试的东西都是序言合同中非常好的候选者。

  2. 我不同意你不应该测试东西,因为它们会产生运行时异常。 如果有的话,你应该测试可能产生运行时异常的东西。 我喜欢运行时异常,因为它们会使系统快速失败 ,这有助于调试。 但是示例中的null是某些可能输入的结果值。 有一个论点是永远不会返回null ,但如果你要去,你应该测试它。

===============>>#5 票数:2

在SOA领域做任何事情时不按合同设计是绝对愚蠢的,如果你正在从事任何类型的模块化工作,以后可能会更换零件,特别是如果涉及任何黑盒子,那么它总是有用的。 。

===============>>#6 票数:1

单元测试和合同设计都是我经验中有价值的测试方法。

我已经尝试在系统自动测试框架中使用Design by Contract,我的经验是提供灵活性和单元测试不易获得的可能性。 例如,可以运行更长的序列,并在每次执行操作时验证响应时间是否在限制范围内。

看看InfoQ上的演示文稿,似乎按合同设计是组件集成阶段中传统单元测试的有价值的补充。 例如,可以先创建一个模拟接口,然后在发布新版本的组件后使用该组件。

我还没有找到一个工具包,涵盖了我在.Net / Microsoft平台上通过合同测试设计的所有设计要求。

===============>>#7 票数:1

代替更具表现力的类型系统,我绝对会在军事级项目上使用合同设计。

对于弱类型语言或具有动态范围的语言(PHP,JavaScript),功能合同也非常方便。

对于其他一切,我会抛弃它依赖beta测试人员和单元测试。

Gaius :运行时会自动抛出Null Pointer异常,在函数序言中测试这些东西没有任何好处。 如果您对文档更感兴趣,那么我会使用可以与静态分析器等一起使用的注释(例如,确保代码不会破坏您的注释)。

一个更强大的类型系统加上契约式设计似乎是要走的路。 以一个例子来看看Spec#

Spec#编程语言。 Spec#是面向对象语言C#的扩展。 它扩展了类型系统,以包括非null类型和已检查的异常。 它以前置条件和后置条件以及对象不变量的形式提供方法契约。

===============>>#8 票数:1

我发现它告诉Go编程语言没有使合同设计成为可能的结构。 恐慌/延迟/恢复并不完全是因为延迟和恢复逻辑可以忽略恐慌,IOW忽略破坏的合同。 至少需要的是某种形式的不可恢复的恐慌,这是真的断言。 或者,最好是通过契约构造(前后条件,实现和类不变量)直接支持设计语言。 但是,由于掌舵Go船的语言纯粹主义者头脑强硬,我对这一切做了很少的改变。

通过在恐慌函数中检查最后一个延迟函数中的特殊断言错误并调用runtime.Breakpoint()来在恢复期间转储堆栈,可以实现类似断言的行为。 断言 - 行为需要有条件。 当然,当在执行断言之后添加新的延迟函数时,这种方法会分崩离析。 这将在大型项目中恰好在错误的时间发生,导致错过错误。

我的观点是,断言在很多方面都很有用,不得不围着它跳舞可能会让人头疼。

===============>>#9 票数:0

是的,它确实! 实际上几年前,我为Argument Validation设计了一个小框架。 我正在做一个SOA项目,其中不同的后端系统进行了所有类型的验证和检查。 但是为了增加响应时间(在输入无效的情况下,以及减少加载那些后端系统),我们开始验证所提供服务的输入参数。 不仅适用于Not Null,还适用于String模式。 或者来自集合内的值。 以及参数之间存在依赖关系的情况。

现在我意识到我们当时通过合同框架实现了一个小设计:)

这是对小型Java Argument Validation框架感兴趣的人的链接。 这是作为普通的Java解决方案实现的。

===============>>#10 票数:0

我实际上并没有每天使用Design by Contract。 我知道它已被纳入D语言,作为语言的一部分。

  ask by translate from so

未解决问题?本站智能推荐:

3回复

是否有按合同设计的php框架?

是否有php的框架或库可以帮助我按合同在应用程序中实现设计? 在最佳情况下,它将在注释中使用javadoc之类的注释。
10回复

一个很好的Java合同设计库? [关闭]

几年前,我做了一个关于Java的DbC包的调查,我对它们中的任何一个都不满意。 不幸的是,我没有对我的发现做好记录,我认为事情已经发生了变化。 有人会关心比较和对比不同的Java DbC包吗?
2回复

Swift合同设计

Swift是否提供本地设计合同支持? 我知道它可以在运行时通过断言完成,但它可以在编译期间完成吗? 或者,有没有外部插件/库这样做? 编辑 通过说“在编译期间按合同设计”,我并不是说库是C#所有功能强大的静态分析器 。 如果它像iContract为Java提供的那样就足够了。
5回复

合同和施工方设计

我出于学校目的而实现了自己的ArrayList,但为了使事情更加生动,我尝试使用C#4.0代码合同。 在我需要将Contracts添加到构造函数之前,一切都很好。 我应该在空参数构造函数中添加Contract.Ensures()吗? 我会说是的,每种方法都应有明确定义的合同。 另一
8回复

合同设计和测试驱动开发[关闭]

我正在努力改进我们小组的开发过程,我正在考虑如何最好地实现与测试驱动开发合同设计。 看来这两种技术有很多重叠,我想知道是否有人对以下(相关)问题有所了解: 除非您使用某种代码生成器根据合同生成单元测试,否则是否违反DRY原则才能使用TDD和DbC? 否则,你必须在两个地方维持合同(
14回复

使用断言或例外通过合同设计? [关闭]

通过合同编程时,函数或方法首先检查其前提是否已满足,然后才开始履行其职责,对吗? 执行这些检查的两个最突出的方法是assert和exception 。 断言仅在调试模式下失败。 确保(单元)测试所有单独的合同前提条件以确定它们是否确实失败是至关重要的。 在调试和释放模式下异
1回复

Objective-C的合同设计? [关闭]

去年,我参加了一个关于设计合同方法的课程。 我们使用Mircosoft Research创建的Contract API在C#中编程,并使用PEX生成单元测试。 今年,我正在用xcode编写iphone应用程序。 我想知道是否存在允许我使用Design By Contract的库,以及一个生
2回复

按合同设计和快速失败

快速失败- 故障响应是系统或模块对故障响应的一种属性。 快速故障系统旨在立即在其接口上报告可能导致故障的任何故障或情况。 快速故障系统通常旨在停止正常运行,而不是尝试继续可能存在缺陷的过程。 这样的设计通常会在操作的多个点检查系统的状态,因此可以及早发现任何故障。 快速故障模块
11回复

C#中的“按合同设计”

我想在我最新的C#应用​​程序中通过契约尝试一点设计,并希望语法类似于: 我知道我可以从单元测试框架中获取这样的静态方法,但是我想知道这样的东西是否已经内置于该语言中,或者是否已经存在某种类型的框架。 我可以编写自己的Assert函数,只是不想重新发明轮子。
3回复

通过合同和断言声明进行设计

我对Design by Contract式Design by Contract方法感兴趣。 对于preconditions ,似乎必须使用已检查的异常来强制执行它们。 但对于post-conditions和class-invariants我认为assertions是首选。 我对吗?