【问题标题】:What do you think of the Managed Contract Tools library您如何看待托管合同工具库
【发布时间】:2009-01-26 14:37:42
【问题描述】:

我最近看了这个视频 http://channel9.msdn.com/pdc2008/TL51/ 关于托管合同工具库,它看起来非常有趣。可悲的是,他们似乎不会将其包含在语言本身中,这会像 Spec# 中那样更优雅。事实上,如果在 C#4.0 中同时拥有这两个选项,那就太好了,因为 Contracts 给业务代码增加了很多噪音。

这里有人用过它并有一些真实的反馈吗?您还可以将合同添加到类属性甚至变量中吗?类似的东西

decimal Percentage (min 0, max 1)
string NotNullString (not null, regex("??"))

也许会很好。

【问题讨论】:

    标签: c#-4.0 design-by-contract spec#


    【解决方案1】:

    我正在尝试,但我认为该库还太年轻,无法在大型项目上认真使用,至少在启用静态检查的情况下:编译非常慢,具体警告不是很清楚阅读。

    运行时检查可以毫无问题地使用,因为它们似乎是作为 Debug.Assert 实现的。至少你记录了方法。

    为了给属性添加契约,我会为 set 属性添加约束,但在这种特定情况下,我认为编写一个可以实际封装需求的类会更好,只允许构造好的对象。无论如何:

        private decimal _Percentage;
        decimal Percentage
        {
            get{ return _Percentage;}
            set
            {
                CodeContract.RequiresAlways(value <= 1);
                CodeContract.RequiresAlways(value >= 0);
                _Percentage = value;
            }
        }
    

    p.s:在我看来,C# 的趋势是朝着动态类型方向发展,而不是走向严格和强类型的编码方法。我认为DbC 更适合强类型,至少因为它可以让您对类型和函数添加更多要求。

    【讨论】:

    • +1,非常有趣。我想我会在自己尝试图书馆之前稍等片刻。只要动态特性实现得好,它们就在 c# 中赢得了一席之地,我无法想象没有 Linq 了
    【解决方案2】:

    合同库似乎很适合 Linq2Sql。在您的 sql 数据库中定义字段和约束,并且可以为您生成合同。这可能是对合同的一个很好的介绍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-19
      相关资源
      最近更新 更多