Tag: 设计合同

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

考虑这种不可变类型: 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; } } 这里要注意两件事: 有一个契约不变量,它确保Path属性永远不能为null 构造函数检查path参数值以遵守先前的合约不变量 此时, Setting实例永远不能具有null Path属性。 现在,看看这种类型: public class Program { private readonly string _path; [ContractInvariantMethod] private void ObjectInvariants() { Contract.Invariant(_path […]

由合同和构造者设计

我正在为学校目的实现我自己的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); } 我会说是的,每种方法都应该有明确的合同。 另一方面,如果只是将工作委托给“主”构造函数,为什么要这样做呢? 逻辑上,我不需要。 我认为在两个构造函数中明确定义合同有用的唯一方面是,如果将来我们对合同有Intelisense支持。 如果发生这种情况,那么明确每种方法所具有的合同是非常有用的,因为它出现在Intelisense中。 此外,是否有任何书籍更深入地了解合同设计的原则和用法? 有一件事是知道如何在一种语言中使用Contracts的语法(在本例中为C#),另一种是知道如何以及何时使用它。 我阅读了几篇教程和Jon Skeet关于它的C#深度文章,但如果可能的话,我想更深入一些。 谢谢