C# 使用代码契约验证参数属性

C# 使用代码契约验证参数属性,c#,code-contracts,C#,Code Contracts,我与一位同事讨论了如何使用代码契约来执行先决条件检查 假设我们有以下代码: 命名空间项目 { 使用制度; 使用System.Diagnostics.Contracts; 公共类事物 { 公共字符串Foo{get;set;} 公共整型条{get;set;} } 公共类ThingsManipulator { 公共无效添加对象(对象) { Contract.Requires,也许我遗漏了什么?这有助于将契约看作是事实陈述,而不是验证者试图证明的事实陈述。你本质上是在说“只要我的输入是正确的(Contr

我与一位同事讨论了如何使用代码契约来执行先决条件检查

假设我们有以下代码:

命名空间项目
{
使用制度;
使用System.Diagnostics.Contracts;
公共类事物
{
公共字符串Foo{get;set;}
公共整型条{get;set;}
}
公共类ThingsManipulator
{
公共无效添加对象(对象)
{

Contract.Requires,也许我遗漏了什么?

这有助于将契约看作是事实陈述,而不是验证者试图证明的事实陈述。你本质上是在说“只要我的输入是正确的(Contract.Requires),那么以下属性就成立(Contract.survey,Contract.Assert,Contract.Invariant)”

契约应该是关于它们所使用的上下文的陈述,应该总是正确的。在你的例子中,你说一个事物的Foo必须是非空的,只有当ThingsManipulator使用它们时才是

如果你可以说一个事物的Foo总是被要求非空的,那么这对于一个事物总是正确的,并且契约属于这个事物

在这种情况下,你不能,所以我认为这成为了一个关于参数的OO设计问题。大声思考:

  • 方法应具有尽可能少的参数(请参阅)
  • AddThing作为一个公共方法,它应该处理更高级别的抽象,而不是像框架值类型这样的细节
  • AddThing是目前唯一对Thing有这些限制的方法
  • 因此,保留Thing类型的单个参数,并检查其属性

  • 如果(3)如果不再是真的,那么可能值得创建一个新的类型来装饰或从事物中派生,并将契约放在那里,以避免问题。但目前,将契约看作不是验证事物,而是验证者试图证明的事实陈述是有帮助的。

    e表示“只要我的输入是正确的(Contract.Requires),那么以下属性保持不变(Contract.assures、Contract.Assert、Contract.Invariant)”

    契约应该是关于它们所使用的上下文的陈述,应该总是正确的。在你的例子中,你说一个事物的Foo必须是非空的,只有当ThingsManipulator使用它们时才是

    如果你可以说一个事物的Foo总是被要求非空的,那么这对于一个事物总是正确的,并且契约属于这个事物

    在这种情况下,你不能,所以我认为这成为了一个关于参数的OO设计问题。大声思考:

  • 方法应具有尽可能少的参数(请参阅)
  • AddThing作为一个公共方法,它应该处理更高级别的抽象,而不是像框架值类型这样的细节
  • AddThing是目前唯一对Thing有这些限制的方法
  • 因此,保留Thing类型的单个参数,并检查其属性

  • 如果(3)如果不再是真的,那么可能值得创建一个新类型来装饰或从事物派生,并将合同放在那里,以避免出现问题。但目前,。

    我认为在您的情况下,验证学生的姓名和年龄应该是
    学生的构造函数和/或setter的责任。I在你的例子中,验证学生的姓名和年龄应该是
    学生的构造函数和/或设置者的责任。感谢你的输入,我完全同意你的观点,即始终保持不变的检查应该放在对象的不变方法中。我指的是不能应用于全局的检查y、 这与一个方法有关(我的错误,我选择了一个错误的例子,我重构了它并扩展了这个问题)。感谢您的输入,我完全同意您的观点,即始终保持不变的检查应该放在对象的不变方法中。我指的是无法全局应用的检查,这些检查与单个方法相关(我的错误,我在那里选择了一个错误的示例,我重构了它并扩展了问题)。