问题标签 [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.
orm - DDD:存储库合约
我在很多地方读到过,DDD 中的一个重要要求是对存储库有一个有界合同:
并且不提供通用查询接口:
我确实理解为什么这很重要:能够模拟存储库以进行测试,或更改底层持久性框架。
虽然在整个应用程序中执行此规则并不难,但在为用户提供“高级搜索”表单时,我不知道如何执行它。
假设我有一个表单,它允许按关键字、日期、作者等搜索博客文章。
这些标准可以自由组合,我显然无法为每个用例提供方法:
我错过了什么还是规则的例外之一?
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)。可悲的是,这并没有解决问题。
objective-c - 为什么在项目中使用“断言”?(以及为什么多次使用它)
我正在阅读示例代码 ListAdder,在变量之后有很多断言,或者几乎在每种方法中都使用了,例如:
self.formatter = [[[NSNumberFormatter alloc] init] autorelease];
assert(self.formatter != nil);
或者 :
我想知道,这样做有什么意义?
谢谢
c# - 处理 switch 语句
处理以下情况的首选方法是什么:
我肯定知道numberOfActualBytes
由于使用过的合同在范围内1-4
。
我应该如何编写不会导致not all code paths return a value
错误的代码?
我怀疑我应该在这个函数的末尾或 in 中抛出一些异常default switch case
,但可能有更好的解决方案。
c# - 合同。需要使用
这是我的问题。我是合同设计的忠实拥护者,我正在使用这个概念,尤其是在开发可供其他开发人员使用的库时。我刚刚发现了一种新的方法,那就是:Contract.Requires
而不是Exception
:所以而不是:
我现在有:
编辑:我在调试模式下在 VS2010 下工作。
问题:Contract.Requires
什么都不做,即使name
是null
!
MSDN文档说:
指定封闭方法或属性的前置条件协定。
但如果条件不满足,则不指定任何内容!
我还注意到还有其他 Contract.Requires
重载会引发异常、显示消息……但那是Contract.Requires(Boolean)
为了什么?
下面的编辑答案强调必须安装插件才能拥有Contract
API 的全部功能,但是希望他们的代码在不同平台上表现相同的 Mono 用户呢?
java - 我的课程应该限制开发人员对他们做错事吗?
我试图了解好的合同在哪里结束,而偏执狂从哪里开始。真的,我只是不知道优秀的开发人员应该关心什么以及他应该忽略什么:)
假设我有一个保存值的类,比如 java.lang.Integer。它的实例由其他对象(MappedObjects)聚合(一对多或多对多),并且经常在 MappedObjects 的方法中使用。此外,出于性能原因,我还在 TreeMap(guava MultiMap,没关系)中跟踪这些关系,以便能够对绑定到某个整数键范围的 MappedObjects 进行快速迭代。因此,为了使系统保持一致状态,我应该修改 MappedObject.bind(Integer integer) 方法来更新我的 Map,如:
我可以用这个 final 方法创建抽象的 MappedObject 类,强迫其他人从它继承,但这很粗鲁。如果我将 MappedObject 定义为带有方法 bind() 的接口并提供骨架实现——其他开发人员稍后可能会忘记将其包含在对象中并在不更新 Map 的情况下自行实现方法。
computer-science - 这个语句可以被视为类不变量吗?
这是一个非常普遍的想法,但让我们在此示例中使用 C#。
鉴于
- 我有一个一次性类
Foo
,即它实现IDisposable
。 Foo
有一个布尔标志disposed
,在被调用之前为假Dispose
,之后为真。Foo
throws的所有公共方法在调用时ObjectDisposedException
如果disposed
为真。
有没有这个说法
的任何方法
Foo
,除了,将在已释放的实例上调用时Dispose
抛出一个。ObjectDisposedException
Foo
描述一个不变量Foo
?
python - 在 Python 中使用契约式设计
我希望在工作中的大量基于 Python 的项目中开始使用 DBC,并且想知道其他人使用它有什么经验。到目前为止,我的研究结果如下:
- http://www.python.org/dev/peps/pep-0316/ - PEP 316 应该通过合同对 Python 进行标准化设计,但已被推迟。此 PEP 建议使用文档字符串。
- http://www.wayforward.net/pycontract/ - Python 的合同。这似乎是一个使用文档字符串的完整但未维护的框架。
- http://www.nongnu.org/pydbc/ - 使用元类实现合约的 PyDBC。几年也没有维护。
我的问题是:您是否将 DBC 与 Python 一起用于成熟的生产代码?它的效果如何/值得付出努力吗?您会推荐哪些工具?
design-by-contract - 如何使用 RESTful Web 服务按合同进行编码
作为最佳实践,我们公司使用合同优先方法创建 Web 服务。
WSDL 是在考虑实现之前定义的。
是否可以使用 REST 使用这种方法?我正在考虑使用 XSD,但是调用通常不是 XML!那么如何以机器可解释的方式指定合约呢?
java - 在按合同设计中,什么样的先决条件是明智的?
假设我们有一个Student
具有以下构造函数的类:
如果我错了,请纠正我,但我认为在这个例子中,我通过简单地指定可能的输入值的(相当静态的)约束并在那些没有满足的情况下引发一个通用的、未经检查的异常来遵循合同范式的设计。
现在,有一个后端类管理学生列表,按他们的入学编号索引。它持有一个来保存这个映射并通过一个方法Map<Integer, Student>
提供对它的访问:addStudent
现在让我们假设这种方法有一个约束,例如“数据库中必须不存在具有相同入学编号的学生”。
我看到了如何实现这一点的两种选择:
选项 A
定义一个自定义类,如果学生具有相同的矩阵,UniquenessException
则由该类提出。addStudent
号码已经存在。调用代码将如下所示:
选项 B
将要求声明为先决条件,IAE
如果不成立,则简单地提出。另外,提供一个canAddStudent(Student stud)
提前检查是否addStudent
会失败的方法。调用代码将如下所示:
从软件工程的角度来看,我觉得选项 A 更清晰,至少有以下原因:
- 无需修改调用代码即可轻松实现线程安全(感谢 Voo 将我指向TOCTTOU,这似乎描述了那个确切的问题)
因此我想知道:
- 有没有更好的第三种选择?
- 选项B有我没有想到的优势吗?
- 从合同设计的角度来看,实际上是否允许使用选项 B 并将唯一性定义为
addStudent
方法的先决条件? IAE
何时定义前置条件并简单地提出以及何时使用“正确”异常是否有经验法则?我认为“除非它取决于系统的当前状态,否则将其作为先决条件”可能是这样的规则。有更好的吗?
更新:似乎还有另一个不错的选择,即提供一种public boolean tryAddStudent(...)
不引发异常而是使用返回值指示错误/失败的方法。