<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Contract - 标签 - Victor's Code Journey</title><link>http://www.victorchu.info/tags/contract/</link><description>Contract - 标签 - Victor's Code Journey</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><managingEditor>victorchu0610@outlook.com (victorchutian)</managingEditor><webMaster>victorchu0610@outlook.com (victorchutian)</webMaster><lastBuildDate>Sat, 04 Apr 2020 17:14:32 +0800</lastBuildDate><atom:link href="http://www.victorchu.info/tags/contract/" rel="self" type="application/rss+xml"/><item><title>契约式编程</title><link>http://www.victorchu.info/posts/2020/04/b72f5ab1/</link><pubDate>Sat, 04 Apr 2020 17:14:32 +0800</pubDate><author><name>victorchutian</name></author><guid>http://www.victorchu.info/posts/2020/04/b72f5ab1/</guid><description><![CDATA[<div class="featured-image">
                <img src="/feature-images/architecture.webp" referrerpolicy="no-referrer">
            </div><p>契约式设计(Design by Contract)，也被称为契约式编程，契约优先式开发或代码合约等，是一种设计软件的方法。这种方法要求软件设计者为软件组件定义正式的，精确的并且可验证的接口，这样，为传统的抽象数据类型又增加了先验条件、后验条件和不变式。这种方法的名字里用到的“契约”或者说“契约”是一种比喻，因为它和商业契约的情况有点类似。</p>
<p>DbC的核心思想是对软件系统中的元素之间相互合作以及&quot;责任&quot;与&quot;权利&quot;的比喻。这种比喻从商业活动中&quot;客户&quot;与&quot;供应商&quot;达成&quot;契约&quot;而得来。例如：</p>
<ul>
<li>供应商必须提供某种产品（责任），并且他有权期望客户已经付款（权利）。</li>
<li>客户必须付款（责任），并且有权得到产品（权利）。</li>
<li>契约双方必须履行那些对所有契约都有效的责任，如法律和规定等。</li>
</ul>
<p>同样的，如果在面向对象程序设计中一个类的函数提供了某种功能，那么它要：</p>
<ul>
<li>期望所有调用它的客户模块都保证一定的进入条件：这就是函数的先验条件—客户的义务和供应商的权利，这样它就不用去处理不满足先验条件的情况。</li>
<li>保证退出时给出特定的属性：这就是函数的后验条件—供应商的义务，显然也是客户的权利。</li>
<li>在进入时假定，并在退出时保持一些特定的属性：不变条件。</li>
</ul>]]></description></item></channel></rss>