C# “如何理解”的含义;“合同”;

C# “如何理解”的含义;“合同”;,c#,.net,terminology,C#,.net,Terminology,我总是看到“合同”这个词,它似乎有不同的含义,或者至少在我看来是这样的(我不是英语母语人士),所以当我看到“合同”这个词时,我不能确定我应该理解什么,从中期待什么。我不知道是否有其他人也有同样的问题,但这让我很烦。例如,当我看到“接口”时,它让我想到“抽象、依赖注入、继承等等”,我知道我在寻找什么,并且它在我的脑海中很好很容易地形成 但是当提到合同这个词时,我无法想象一个模式、类等等,不管它是什么。它是使用接口或类或属性等形成的吗 例如,有一个类(在Json.NET中)讨论了一个名为IContr

我总是看到“合同”这个词,它似乎有不同的含义,或者至少在我看来是这样的(我不是英语母语人士),所以当我看到“合同”这个词时,我不能确定我应该理解什么,从中期待什么。我不知道是否有其他人也有同样的问题,但这让我很烦。例如,当我看到“接口”时,它让我想到“抽象、依赖注入、继承等等”,我知道我在寻找什么,并且它在我的脑海中很好很容易地形成

但是当提到合同这个词时,我无法想象一个模式、类等等,不管它是什么。它是使用
接口
属性
等形成的吗

例如,有一个类(在Json.NET中)讨论了一个名为
IContractResolver
的东西,该页面解释了它的用途:

IContractResolver接口提供了一种自定义 JsonSerializer将.NET对象序列化并反序列化为JSON 不在类上放置属性

解释很容易理解,但当我看到合同时,我不能仅仅形成想法,我不能说:

“嗯,我希望有一些方法可以做到这一点和那一点,这样我就可以 重写它,然后我在这里/那里使用这个类来更改/实现 一些功能等。”

这让我很烦。我读了一些关于它的文章,但他们正在谈论它,对于那些对“合同”的含义有疑问的人来说,它是没有用的

那么,有人能解释一下我应该如何理解这个术语,以及当我看到它时我应该期待什么吗?如果您能添加一些示例代码以便我将其可视化,那就太好了。

在“契约式设计”中,契约是指库(类、函数)的开发人员和使用者之间的协议

这可能是一个协议,没有人会通过某个参数的
null
。一个特定的方法总是在不到200毫秒的时间内完成,这可能是一个共识。或者在创建对象的线程上引发事件。重要的是,有一些文档充满了规则,调用方和函数都同意这些规则


IContractResolver
听起来像是提供了一种数据格式。这不是合同。(可能有一个约定说通信的两个端点都将对特定的消息使用这种格式,但一种格式本身并不是一个完整的约定。约定还需要描述每个消息应该在什么时候发送,依此类推。),合同是一种负担词,根据上下文有多种含义

对我来说,它是双方之间的任何协议,因此它可以是.NET接口意义上的接口(即类型),也可以是双方之间交换的消息集和序列(即协议),或者在JSON示例中是对象与其持久形式之间的映射


有趣的是,您提到的“接口”更清晰,因为它不一定如此。我不把它与抽象、依赖注入或继承(尤其是最后一个)联系起来,而是更松散地与任何类型的协议联系起来。可能是因为我开始使用的语言没有内置具有特定含义和关键字的接口(例如C++)。关键是它还取决于上下文

合同是至少两方之间的协议。在这种情况下,.NET合同是非常有意义的


在按合同设计的环境中,这是相似的。通过协议进行设计,就是在一个接口和一些可验证的义务上达成一致。

合同是一个相当宽泛的术语,但有一些特定的含义。因此,要正确理解它,你应该了解上下文。一般定义如下(来源):

两个或两个以上的人或双方之间有约束力的协议

它可以是关于提供哪些操作的协议(部分与协议同义),例如:

服务合同指定了服务支持的操作

或者必须以什么格式传递数据():

数据契约是服务和客户之间的正式协议

另外,
接口
有时也被称为契约——因为它就是契约:关于可以调用什么以及如何调用的约束性协议

数据驱动开发中的契约也是关于可以传递哪些数据、可以返回哪些数据以及对象的有效状态的协议。它本质上与第一句话相同:两段不同代码之间的约束协议

所以,如果你不确定上下文,试着用常识。如果您不熟悉上下文,请尝试理解或询问:

  • 在这种情况下,合同定义是什么
  • 它是如何定义的
  • 涉及哪些方面

感谢您在第二段中使用的示例。你说下列假设正确吗“我公开了一个接口,并在调用库中的方法时期望它。所以对于任何使用这个库的人,基本上我告诉他们,如果你想使用这个方法,你应该遵守作为接口的契约,并实现它,就像我将使用接口实现中定义的方法一样。这里接口定义了契约。“@Tarik:是的,传递给方法的对象需要符合契约。但是契约远远超出了编译器已知的
接口
声明。一个好的契约将涵盖先决条件和后决条件(例如,在什么条件下抛出异常,
-1
作为返回值的含义是什么等)请您用更多的例子详细说明这些先决条件和后决条件好吗?我非常感谢您的时间。