2

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

但是当谈到这个词时,contract我无法想象一个模式、类等。不管它是什么。它是使用interface或 aclass或 aattribute等形成的东西吗?

例如,这里有一个类在 Json.NET 中),它讨论了一些叫做IContractResolver的东西,页面解释了它的用途:

IContractResolver 接口提供了一种方法来自定义 JsonSerializer 如何将 .NET 对象序列化和反序列化为 JSON,而无需在类上放置属性。

解释很容易理解,但我不能只是在我看到的时候形成这个想法,Contract我不能说:

“嗯,我期待一些方法可以做到这一点,这样我就可以覆盖它,然后我在这里/那里使用这个类来更改/实现一些功能等。”

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

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

4

4 回答 4

3

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

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

IContractResolver听起来它提供了一种数据格式。这不是合同。(可能有一个合同规定通信的两个端点都将对特定消息使用这种格式,但格式本身并不是一个完整的合同。合同还需要描述何时应该发送每条消息,等等。 )

于 2013-04-09T23:27:39.503 回答
3

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

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

于 2013-04-09T23:28:56.353 回答
2

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

两个或多个人或当事方之间的具有约束力的协议

可以就提供的操作达成一致(部分与协议同义),如下所示

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

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

数据合同是服务和客户之间的正式协议

有时也interface被称为合同 - 因为它正是它:关于可以调用什么以及如何调用的具有约束力的协议。

数据驱动开发中的契约也是关于可以传递什么数据,可以返回什么数据,以及对象的有效状态是什么的协议。它本质上与第一个引用中的相同:两个不同代码段之间的绑定协议。

因此,如果您不确定上下文,请尝试使用常识。如果您不熟悉上下文,请尝试理解或询问:

  • 在这种情况下,合同定义了什么?
  • 它是如何定义的?
  • 涉及的各方有哪些?
于 2013-04-09T23:37:11.427 回答
1

好吧,合同是那些根据上下文具有多种含义的负担词之一。

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

有趣的是,您更清楚地提到“界面”,因为它不一定如此。我不将它与抽象、依赖注入或继承(尤其是最后一个)相关联,但更松散地与任何类型的协议相关联。也许原因是我从没有内置具有特定含义和关键字的接口的语言开始(例如 C++)。关键是它还取决于上下文。

于 2013-04-09T23:28:28.510 回答