dev*_*ium 10 .net c# design-by-contract code-contracts c#-4.0
我正在为学校目的实现我自己的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#深度文章,但是如果可能的话,我想更深入一些.
谢谢
我完全不同意托马斯的回答.只要您在执行中做出选择ArrayList(),您就应该签订一份合同来记录这些选择.
在这里,您可以选择使用参数32调用主构造函数.还有许多其他事情可以决定(不仅仅是关于默认大小的选择).给予合同ArrayList()几乎与ArrayList(int)您决定不做大部分愚蠢事情的文件相同,而不是直接调用.
答案"它调用主构造函数,所以让主构造函数的契约完成工作"完全忽略了这样一个事实,即合同可以帮助你避免查看实现.对于基于运行时断言检查的验证策略,即使对于几乎直接调用另一个构造函数/方法的这种简短构造函数/方法,写入契约的缺点是最终会检查两次.是的,这似乎是多余的,但运行时断言检查只是一种验证策略,而DbC的原则是独立的.原则是:如果可以调用它,它需要一份合同来记录它的作用.
| 归档时间: |
|
| 查看次数: |
2318 次 |
| 最近记录: |