标签: design-by-contract

我错误地实施了这个简单的合同吗?

这是我的代码:

public class RegularPolygon
{
    public int VertexCount;
    public double SideLength;

    public RegularPolygon(int vertexCount, double sideLength)
    {
        Contract.Requires(vertexCount >= 3);
        VertexCount = vertexCount;
        SideLength = sideLength;
    }

    [ContractInvariantMethod]
    private void RegularPolygonInvariants()
    {
        Contract.Invariant(VertexCount>=3);
    }

}
Run Code Online (Sandbox Code Playgroud)

我尝试使用Contract.RequiresContract.Invariant方法来防止vertexCount变量小于或等于2; 但是我仍然能够初始化一个具有2个或更少边的RegularPolygon.我的(简化)NUnit测试如下所示:

[TestFixture]
class TestRegularPolygon
{
    private RegularPolygon _polygon;

    [SetUp]
    public void Init()
    {
        _polygon = new RegularPolygon(1, 50);
    }

    [Test]
    public void Constructor()
    {
        Assert.That(_polygon.VertexCount,Is.GreaterThanOrEqualTo(3));
    }

}
Run Code Online (Sandbox Code Playgroud)

以上测试也通过,我无法弄清楚为什么!

起初我以为ReSharper可能会弄乱一些东西,因为它会在我尝试使用Contract命名空间中的方法时显示该行并显示此消息:

跳过方法调用.编译器不会生成方法调用,因为该方法是有条件的,或者是没有实现的部分方法.

但暂停R#并在NUnit中运行测试具有相同的结果,VS中也没有错误或警告.所以我认为这只是因为ReSharper还没有强调代码合同的兼容性.

我查看了文档,据我所知,我不应该遇到这个问题.

我是否正确使用代码合同或是我的环境阻止它以某种方式工作?

谢谢.

c# resharper design-by-contract visual-studio-2010 code-contracts

17
推荐指数
1
解决办法
5343
查看次数

用C++检查不变量

是否有任何已建立的模式来检查C++中的类不变量?

理想情况下,将在每个公共成员函数的开头和结尾自动检查不变量.据我所知,带有类的C提供了特殊功能beforeafter成员功能,但不幸的是,合同设计当时并不普及,除了Bjarne之外没有人使用该功能,所以他删除了它.

当然,check_invariants()在每个公共成员函数的开头和结尾手动插入调用是繁琐且容易出错的.由于RAII是处理异常的首选武器,我提出了以下方案,将不变性检查器定义为第一个局部变量,并且不变性检查器在构造和销毁时检查不变量:

template <typename T>
class invariants_checker
{
    const T* p;

public:

    invariants_checker(const T* p) : p(p)
    {
        p->check_invariants();
    }

    ~invariants_checker()
    {
        p->check_invariants();
    }
};

void Foo::bar()
{
    // class invariants checked by construction of _
    invariants_checker<Foo> _(this);

    // ... mutate the object

    // class invariants checked by destruction of _
}
Run Code Online (Sandbox Code Playgroud)

问题#0:我想没有办法声明一个未命名的局部变量?:)

我们仍然需要check_invariants()Foo构造函数的末尾和Foo析构函数的开头手动调用.但是,许多构造函数体和析构函数体都是空的.在那种情况下,我们可以使用a invariants_checker作为最后一个成员吗?

#include <string>
#include <stdexcept>

class Foo
{
    std::string str;
    std::string::size_type cached_length; …
Run Code Online (Sandbox Code Playgroud)

c++ templates design-by-contract invariants object-lifetime

15
推荐指数
1
解决办法
3029
查看次数

Java:调用hashCode()和equals()时自动抛出UnsupportedOperationException的干净方法?

我们有一个OO代码库,在很多情况下hashcode()并且equals()根本不起作用,主要是由于以下原因:

除非您愿意放弃面向对象抽象的好处,否则无法扩展可实例化的类并在保留equals合同的同时添加值组件.

这是Joshua Bloch撰写的"Effective Java"的引用,在这篇伟大的Artima文章中有关于该主题的更多内容:

http://www.artima.com/lejava/articles/equality.html

我们完全没问题,这不是这个问题的意思.

问题是:看到事实上,在某些情况下你无法满足equals()合同,什么是自动制作hashcode()equals()抛出UnsupportedOperationException 的干净方法?

注释会起作用吗?我正在考虑这样的事情@NotNull:每次@NotNull合同违规都会自动抛出异常,除了用你的参数/返回值注释之外别无他法@NotNull.

它很方便,因为它是8个字符("@NotNull")而不是不断重复相同的验证/抛出异常代码.

在我关注的情况下,在每个hashCode()/equals()没有意义的实现中,我们总是重复同样的事情:

@Override
public int hashCode() {
    throw new UnsupportedOperationException( "contract violation: calling hashCode() on such an object makes no sense" );
}

@Override
public boolean equals( Object o ) {
    throw new UnsupportedOperationException( "contract violation: calling equals() on such an object makes no sense" );
}
Run Code Online (Sandbox Code Playgroud)

然而,这很容易出错:我们可能会忘记剪切/粘贴此内容,这可能会导致用户滥用此类对象(例如,尝试将它们放入默认的Java集合中).

或者,如果无法创建注释来创建此行为,AOP是否有效?

有趣的是,真正的问题是Java层次结构的存在hashCode()和 …

java design-by-contract equals

14
推荐指数
3
解决办法
6967
查看次数

代码合同比 对象初始化器(.net 4.0)

从表面看,对象初始化器似乎对.net 4.0"代码契约"提出了问题,通常在对象构造函数完成时应该建立不变量.然而,据推测,对象初始化器需要在构造完成后设置属性.

我的问题是,"代码契约"的不变量是否能够处理对象初始化器,"好像"属性是在构造函数完成之前设置的?那确实非常好!!

.net design-by-contract .net-4.0 object-initializers code-contracts

14
推荐指数
1
解决办法
1025
查看次数

你如何在Perl中按合同设计?

我对我们的Perl项目中使用DbC的调查,我试图找到验证在源合同(例如,检查前/后置条件,不变量等)的最佳方法

Class :: Contract由Damian Conway编写,现在由C. Garret Goebel维护,但看起来它已经超过8年未被触及.

看起来我想要使用的是Moose,因为它似乎可能提供可用于DbC的功能,但我想知道是否有人有任何资源(文章等)如何去做,或者如果有任何有用的模块,我无法找到.

有人用Perl做DbC吗?我应该"跳进"Moose,看看我能为它做些什么吗?

perl design-by-contract moose

12
推荐指数
1
解决办法
912
查看次数

代码合同:为什么有些不变量不在课堂外考虑?

考虑这种不可变类型:

public class Settings
{
    public string Path { get; private set; }

    [ContractInvariantMethod]
    private void ObjectInvariants()
    {
        Contract.Invariant(Path != null);
    }

    public Settings(string path)
    {
        Contract.Requires(path != null);
        Path = path;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里要注意两件事:

  • 有一个合同不变量,确保Path财产永远不会null
  • 构造函数检查path参数值以遵守先前的合约不变量

此时,Setting实例永远不会拥有null Path属性.

现在,看看这种类型:

public class Program
{
    private readonly string _path;

    [ContractInvariantMethod]
    private void ObjectInvariants()
    {
        Contract.Invariant(_path != null);
    }

    public Program(Settings settings)
    {
        Contract.Requires(settings != null);
        _path = settings.Path;
    } // <------ "CodeContracts: …
Run Code Online (Sandbox Code Playgroud)

.net c# design-by-contract static-analysis code-contracts

12
推荐指数
1
解决办法
3108
查看次数

用PHP编写合同编程

按合同编程是.NET的一个现代趋势,但是PHP中的代码契约的库/框架呢?您如何看待这种范例对PHP的适用性?

谷歌搜索"代码合同PHP"没有给我任何帮助.

注意:"按合同编写代码",我指的是按合同设计,因此它与.NET或PHP接口无关.

php design-patterns design-by-contract code-contracts

12
推荐指数
1
解决办法
7096
查看次数

.NET 4.0的合同设计与Eiffel相比如何?

除了Bertrand Meyer本人之外,我很高兴在大学里教埃菲尔,并且只读了.NET 4.0将包括合同设计.

任何有洞察力的人都可以详细说明这与Eiffel的现有功能集相比有多强大吗?

是否支持接口合同?

.net design-by-contract eiffel

11
推荐指数
1
解决办法
834
查看次数

由合同和构造者设计

我正在为学校目的实现我自己的ArrayList,但为了调整一些东西,我正在尝试使用C#4.0代码契约.一切都很好,直到我需要将Contracts添加到构造函数中.我应该在空参数构造函数中添加Contract.Ensures()吗?

    public ArrayList(int capacity) {
        Contract.Requires(capacity > 0);
        Contract.Ensures(Size == capacity);

        _array = new T[capacity];
    }

    public ArrayList() : this(32) {
        Contract.Ensures(Size == 32);
    }
Run Code Online (Sandbox Code Playgroud)

我会说是的,每种方法都应该有明确的合同.另一方面,如果它只是将工作委托给"主"构造函数,为什么要这样做呢?逻辑上,我不需要.

我认为在两个构造函数中明确定义合同有用的唯一方面是,如果将来我们对合同有Intelisense支持.如果发生这种情况,明确每种方法所具有的合同是非常有用的,因为它出现在Intelisense中.

此外,是否有任何书籍更深入地了解合同设计的原则和用法?有一件事是了解如何在一种语言中使用Contracts的语法(在本例中为C#),另一种是知道如何以及何时使用它.我阅读了几篇教程和Jon Skeet的C#深度文章,但是如果可能的话,我想更深入一些.

谢谢

.net c# design-by-contract code-contracts c#-4.0

10
推荐指数
1
解决办法
2318
查看次数

在R中检查和记录函数前置条件和后置条件的惯用方法是什么?

在R中检查和记录函数前置条件和后置条件的惯用方法是什么?我会考虑Eiffel的建成requireensure结构或Dinout艺术在这里的块的状态,但这些在接近他们,所以已经开发的最佳实践出炉的大多数语言都没有.

通过检查前置条件,我的意思是,如果传递了不符合函数假设的数据,则会抛出某种运行时异常.目前stopifnot,我可以在函数开始时考虑每个前提条件.这同样适用于后置条件,但是对于返回值而不是参数.

此外,是否有标准的方法来记录这些先决条件和后置条件是什么?例如,在Java中用JavaDoc注释拼写这些是非常标准的.

R在这方面的最佳做法是什么?

design-by-contract exception-handling r

10
推荐指数
1
解决办法
237
查看次数