Questions tagged «code-contracts»

4
我为什么要使用代码合同
最近,我偶然发现了Microsoft的代码合同框架。 我阅读了一些文档,发现自己不断问:“为什么我要这样做,因为它通常也不执行静态分析。” 现在,我已经有了一种防御性编程风格,并带有如下防护异常: if(var == null) { throw new NullArgumentException(); } 我也大量使用NullObject Pattern,很少遇到任何问题。向其添加单元测试,就一切就绪。 我从未使用过断言,也从未错过它们。恰恰相反。我真的很讨厌其中包含很多毫无意义的断言的代码,这对我来说只是噪音,使我无法真正看到。代码合同,至少是Microsoft的方法,几乎​​是一样的,甚至更糟。它们给代码增加了很多噪音和复杂性。在99%的情况下,无论如何都会抛出异常-所以我不在乎它是来自断言/合同还是实际问题。程序状态真正被破坏的情况极少出现。 坦率地说,使用代码契约有什么好处?有没有?如果您已经在使用单元测试和防御性代码,我认为引入合同是不值得的,并且会给维护人员在更新方法时要诅咒的代码带来噪音,就像我看不到代码在做什么一样由于无用的断言。我还没有看到支付该价格的充分理由。

2
何时在构造函数上使用[Pure]?
我正在学习.NET中的代码协定,并且试图了解纯构造函数的概念。该代码合同文档状态: 合同中调用的所有方法都必须是纯函数。也就是说,它们不得更新任何先前存在的状态。允许使用纯方法修改进入纯方法后创建的对象。 并且PureAttribute文档指出: 指示类型或方法是纯类型,即,它不进行任何可见状态更改。 对于方法,我理解这些语句,但是构造函数呢?假设您有一个像这样的课程: public class Foo { public int Value { get; set; } public Foo(int value) { this.Value = value; } } 显然,此构造函数确实会影响新Foo对象的状态,但是它没有其他副作用(例如,它不操纵任何参数或调用任何非纯方法)。这是候选人[Pure]吗?[Pure]在构造函数上放置属性的意义是什么?何时应该在自己的代码中执行此操作?

6
基于合同的编程与单元测试
我是一个有点防御性的程序员,并且是Microsoft代码合同的忠实拥护者。 现在我不能总是使用C#,在大多数语言中,我唯一拥有的工具就是断言。所以我通常会得到这样的代码: class { function() { checkInvariants(); assert(/* requirement */); try { /* implementation */ } catch(...) { assert(/* exceptional ensures */); } finally { assert(/* ensures */); checkInvariants(); } } void checkInvariants() { assert(/* invariant */); } } 但是,这种范式(或您所说的任何范式)会导致很多代码混乱。 我开始怀疑这是否值得付出努力,是否已经进行了适当的单元测试?

2
代码合同/声明:重复检查怎么办?
我非常喜欢用我使用的语言编写断言,合同或任何类型的支票。让我感到困扰的一件事是,我不确定处理重复支票的通用做法。 情况示例:我首先编写以下函数 void DoSomething( object obj ) { Contract.Requires<ArgumentNullException>( obj != null ); //code using obj } 然后几个小时后,我编写了另一个函数,该函数调用第一个函数。由于所有内容仍在内存中,因此我决定不重复合同,因为我知道DoSomething已经检查了一个空对象: void DoSomethingElse( object obj ) { //no Requires here: DoSomething will do that already DoSomething( obj ); //code using obj } 明显的问题:DoSomethingElse现在依赖于DoSomething验证obj不为null。因此,应该DoSomething决定不再检查,或者如果我决定使用另一个函数,则可能不再检查obj。毕竟,这导致我要编写此实现: void DoSomethingElse( object obj ) { Contract.Requires<ArgumentNullException>( obj != null …

4
在事件驱动的微服务架构中处理更改
我正在做一个研究项目,正在研究处理事件驱动的微服务体系结构中的更改的选项。 因此,假设我们有一个应用程序,其中有四个不同的服务。这些服务中的每一个都有自己的数据库来存储本地数据。 在此设置中,这四个服务使用事件总线相互通信。因此,当服务中发生某些事情时,它会发布一个事件。所有对该事件感兴趣的其他服务都将以自己的方式对其进行处理。 在那种情况下,架构中的不同服务需要就这些事件(属性等)的内容订立“合同”。因此,服务对这些事件具有“松散耦合的依赖性” 我的问题是: 我们如何应对这些事件的变化? 因此,假设服务A在应用程序中注册了新用户。因此,它发送一个“ UserRegistered”事件,服务B拾取该事件并对其进行处理,但是服务C小组的一些开发人员决定他们也需要注册用户的性别,因此该事件被更改,属性性别被添加到“ UserRegistered”事件。 我们如何确保服务B仍可以在不重新部署的情况下使用该额外属性来拾取同一事件? 还有其他方法可以解决此问题,然后对这些事件进行版本控制吗?
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.