微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 按合同和构造函数设计

我正在为了学校目的而实现我自己的ArrayList,但是要调用一些我试图使用C#4.0代码合同的东西.一切都很好,直到我需要添加合同到构造函数.我应该在空参数构造函数添加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所示.

另外,有没有关于“合同设计”的原则和用法的书籍呢?有一点是了解如何使用语言(C#,在这种情况下)使用合同的语法,另外一个是知道如何和何时使用它.我读了几篇教程和Jon Skeet的“深度”文章中的C#,但如果可能,我想要更深入一些.

谢谢

解决方法

我完全不同意托马斯的回答.只要你在ArrayList()的实现中做出选择,你应该有一个合同来记录这些选择.

在这里,您可以选择使用参数32调用主构造函数.还有许多其他可以决定做的事情(不仅仅是关于认大小的选择).给与ArrayList()几乎完全相同的ArrayList()的文档,你决定不做大部分愚蠢的事情,你可以做,而不是直接调用它.

答案“它称之为主要构造函数,所以让主构造商的合同完成工作”完全忽略了这个合同在那里可以避免您不必考虑实现的事实.对于基于运行时断言检查的验证策略,即使对于几乎直接调用一个构造函数/方法的这种简短的构造函数/方法,编写合同的缺点就是您最终检查两次.是的,这似乎是多余的,但是运行时断言检查只是一个验证策略,DbC的原则是独立的.原则是:如果可以调用,它需要一份合同来记录它的作用.

原文地址:https://www.jb51.cc/csharp/94537.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐