问题标签 [design-by-contract]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
947 浏览

orm - DDD:存储库合约

我在很多地方读到过,DDD 中的一个重要要求是对存储库有一个有界合同:

并且不提供通用查询接口:

我确实理解为什么这很重要:能够模拟存储库以进行测试,或更改底层持久性框架。

虽然在整个应用程序中执行此规则并不难,但在为用户提供“高级搜索”表单时,我不知道如何执行它。

假设我有一个表单,它允许按关键字日期作者等搜索博客文章。

这些标准可以自由组合,我显然无法为每个用例提供方法:

我错过了什么还是规则的例外之一?

0 投票
1 回答
696 浏览

java - 将 Cofoja 与 Wicket 一起使用(甚至仅与 Maven 一起使用)

我正在尽我最大的努力让 Google Cofoja 在我的Apache Wicket应用程序中运行,该应用程序使用 Maven2 似乎是标准的。

该项目最初是使用Leg Up生成的,并选择了原型“Wicket 1.4.12、Guice 2.0、WarpPersist 2.0 (snapshot)、Hibernate 3.5.6”。

我最近尝试的(并且似乎是最接近工作的)是使用 maven 构建(我已经设法构建了合同类),然后尝试使用 ant 运行项目以获取合同检查发生。最新的问题是我不确定我的主要课程是什么。我试过让它成为运行码头服务器的类,但我得到一个类未找到异常。

同样,即使我确实让这个解决方案正常工作,这也远不是让合同检查作为 maven build 的一部分发生的理想解决方案。

现在,我目前拥有的:

pom.xml

构建.xml

maven-build.properties

com/mycompany/myproject/adminconsole/Start.java

如果您知道如何解决我当前的 ant 问题,或者更好的是,知道如何将 ant-hack 全部废弃,那将非常令人兴奋(:

更新 1

从代码中删除-'s 是不好的(感谢@Martijn Dashorst)。可悲的是,这并没有解决问题。

0 投票
3 回答
8520 浏览

objective-c - 为什么在项目中使用“断言”?(以及为什么多次使用它)

我正在阅读示例代码 ListAdder,在变量之后有很多断言,或者几乎在每种方法中都使用了,例如:

self.formatter = [[[NSNumberFormatter alloc] init] autorelease]; assert(self.formatter != nil);

或者 :

我想知道,这样做有什么意义?

谢谢

0 投票
3 回答
89 浏览

c# - 处理 switch 语句

处理以下情况的首选方法是什么:

我肯定知道numberOfActualBytes由于使用过的合同在范围内1-4

我应该如何编写不会导致not all code paths return a value错误的代码?


我怀疑我应该在这个函数的末尾或 in 中抛出一些异常default switch case,但可能有更好的解决方案。

0 投票
3 回答
21352 浏览

c# - 合同。需要使用

这是我的问题。我是合同设计的忠实拥护者,我正在使用这个概念,尤其是在开发可供其他开发人员使用的库时。我刚刚发现了一种新的方法,那就是:Contract.Requires而不是Exception:所以而不是:

我现在有:

编辑:我在调试模式下在 VS2010 下工作。

问题:Contract.Requires什么都不做,即使namenull

MSDN文档说:

指定封闭方法或属性的前置条件协定。

但如果条件不满足,则不指定任何内容!

我还注意到还有其他 Contract.Requires重载会引发异常、显示消息……但那是Contract.Requires(Boolean)为了什么?

下面的编辑答案强调必须安装插件才能拥有ContractAPI 的全部功能,但是希望他们的代码在不同平台上表现相同的 Mono 用户呢?

0 投票
5 回答
130 浏览

java - 我的课程应该限制开发人员对他们做错事吗?

我试图了解好的合同在哪里结束,而偏执狂从哪里开始。真的,我只是不知道优秀的开发人员应该关心什么以及他应该忽略什么:)

假设我有一个保存值的类,比如 java.lang.Integer。它的实例由其他对象(MappedObjects)聚合(一对多或多对多),并且经常在 MappedObjects 的方法中使用。此外,出于性能原因,我还在 TreeMap(guava MultiMap,没关系)中跟踪这些关系,以便能够对绑定到某个整数键范围的 MappedObjects 进行快速迭代。因此,为了使系统保持一致状态,我应该修改 MappedObject.bind(Integer integer) 方法来更新我的 Map,如:

我可以用这个 final 方法创建抽象的 MappedObject 类,强迫其他人从它继承,但这很粗鲁。如果我将 MappedObject 定义为带有方法 bind() 的接口并提供骨架实现——其他开发人员稍后可能会忘记将其包含在对象中并在不更新 Map 的情况下自行实现方法。

0 投票
2 回答
84 浏览

computer-science - 这个语句可以被视为类不变量吗?

这是一个非常普遍的想法,但让我们在此示例中使用 C#。

鉴于

  • 我有一个一次性类Foo它实现IDisposable
  • Foo有一个布尔标志disposed,在被调用之前为Dispose,之后为
  • Foothrows的所有公共方法在调用时ObjectDisposedException如果disposed

有没有这个说法

的任何方法Foo,除了,将在已释放的实例上调用时Dispose抛出一个。ObjectDisposedExceptionFoo

描述一个不变量Foo?

0 投票
5 回答
13391 浏览

python - 在 Python 中使用契约式设计

我希望在工作中的大量基于 Python 的项目中开始使用 DBC,并且想知道其他人使用它有什么经验。到目前为止,我的研究结果如下:

我的问题是:您是否将 DBC 与 Python 一起用于成熟的生产代码?它的效果如何/值得付出努力吗?您会推荐哪些工具?

0 投票
1 回答
3541 浏览

design-by-contract - 如何使用 RESTful Web 服务按合同进行编码

作为最佳实践,我们公司使用合同优先方法创建 Web 服务。

WSDL 是在考虑实现之前定义的。

是否可以使用 REST 使用这种方法?我正在考虑使用 XSD,但是调用通常不是 XML!那么如何以机器可解释的方式指定合约呢?

0 投票
2 回答
291 浏览

java - 在按合同设计中,什么样的先决条件是明智的?

假设我们有一个Student具有以下构造函数的类:

如果我错了,请纠正我,但我认为在这个例子中,我通过简单地指定可能的输入值的(相当静态的)约束并在那些没有满足的情况下引发一个通用的、未经检查的异常来遵循合同范式的设计。

现在,有一个后端类管理学生列表,按他们的入学编号索引。它持有一个来保存这个映射并通过一个方法Map<Integer, Student>提供对它的访问:addStudent

现在让我们假设这种方法有一个约束,例如“数据库中必须不存在具有相同入学编号的学生”。

我看到了如何实现这一点的两种选择:

选项 A

定义一个自定义类,如果学生具有相同的矩阵,UniquenessException则由该类提出。addStudent号码已经存在。调用代码将如下所示:

选项 B

将要求声明为先决条件,IAE如果不成立,则简单地提出。另外,提供一个canAddStudent(Student stud)提前检查是否addStudent会失败的方法。调用代码将如下所示:


从软件工程的角度来看,我觉得选项 A 更清晰,至少有以下原因:

  • 无需修改调用代码即可轻松实现线程安全(感谢 Voo 将我指向TOCTTOU,这似乎描述了那个确切的问题)

因此我想知道:

  1. 有没有更好的第三种选择?
  2. 选项B有我没有想到的优势吗?
  3. 从合同设计的角度来看,实际上是否允许使用选项 B 并将唯一性定义为addStudent方法的先决条件?
  4. IAE何时定义前置条件并简单地提出以及何时使用“正确”异常是否有经验法则?我认为“除非它取决于系统的当前状态,否则将其作为先决条件”可能是这样的规则。有更好的吗?

更新:似乎还有另一个不错的选择,即提供一种public boolean tryAddStudent(...)不引发异常而是使用返回值指示错误/失败的方法。