如何理解“契约”的含义

时间:2013-04-09 23:22:40

标签: c# .net terminology

我总是看到单词contract,它似乎有不同的含义,或者至少它看起来像我(我不是英语母语人士)所以当我看到“合同”这个词时,我不能确保我应该理解和期待它。我不知道是否有其他人遇到同样的麻烦,但这让我很烦恼。例如,当我看到“界面”时,它让我想到“抽象,依赖注入,继承等”。而且我知道我在寻找什么,它在我的脑海里形成得非常轻松。

但是当谈到contract这个词时,我无法想象一个模式,类等等。它是使用interface还是class还是attribute等形成的。

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

  

IContractResolver接口提供了一种自定义方式   JsonSerializer将.NET对象序列化和反序列化为JSON   没有在你的课程上放置属性。

解释是非常易于理解的,但是当我看到Contract并且我不能说时,我不能形成这个想法:

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

这让我很烦恼。我读了一些关于它的文章,但他们正在谈论Design by Contract,对于那些遇到“合同”含义问题的人来说,这并不是什么有用的东西。

那么有人可以解释我应该如何理解这个术语以及我看到它时应该期待什么?你可以添加一些示例代码,以便我可视化它,这将是非常好的。

4 个答案:

答案 0 :(得分:3)

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

在合同背景下的设计中,它是相似的。通过协议进行设计,即表示您同意接口和一些可验证的义务。

答案 1 :(得分:2)

在“按合同设计”中,合同是指图书馆(类,职能)的开发者与消费者之间的协议。

这可能是一个协议,没有人会通过null来获取某个参数。这可能是一个特定方法总是在不到200ms内完成的协议。或者在创建对象的线程上引发事件。重要的是,有一些文件充满规则,呼叫者和功能都同意这些规则。

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

答案 2 :(得分:1)

嗯,合同是其中一个负担很多的词,根据具体情况有很多含义。

对我而言,它是双方之间的任何协议,因此它可以是.NET接口(即类型)意义上的接口,或者它可以是各方之间交换的消息的集合和序列(即协议)或在您的JSON示例中,对象与其持久化表单之间的映射。

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

答案 3 :(得分:1)

合同是一个相当广泛的术语,但具有一些特定的含义。所以要正确理解它,你应该知道背景。一般定义是(来自here):

  

两人或多人之间的约束性协议

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

  

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

或者必须以何种格式传递数据(here):

  

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

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

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

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

  • 在这种情况下合约定义了什么?
  • 如何定义?
  • 参与的各方是什么?