NET 40中的新功能介绍契约式设计

上传人:cn****1 文档编号:508441353 上传时间:2023-03-26 格式:DOCX 页数:9 大小:96.69KB
返回 下载 相关 举报
NET 40中的新功能介绍契约式设计_第1页
第1页 / 共9页
NET 40中的新功能介绍契约式设计_第2页
第2页 / 共9页
NET 40中的新功能介绍契约式设计_第3页
第3页 / 共9页
NET 40中的新功能介绍契约式设计_第4页
第4页 / 共9页
NET 40中的新功能介绍契约式设计_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《NET 40中的新功能介绍契约式设计》由会员分享,可在线阅读,更多相关《NET 40中的新功能介绍契约式设计(9页珍藏版)》请在金锄头文库上搜索。

1、.NET 4.0中的新功能介绍:契约式设计什么是契约我们先来看一个很简单的例子:Void WordList.Insert(string word)这个函数负责将word以升序插入到WordList中的单词列表中,word不可以为NULL。上面这些说明文字都是用来描述此函数的行为的。当使用该函数的调用者看到这些说明 文字的时候,便知道函数应该如何调用以及在不同情况下的函数行为,换言之,上面这段说 明文字简单的描述了函数调用者和被调用者的一种约定,这种约定也被称之为契约 (Contracts) 0契约一般来讲可以分成三类,包括:1. Precondition:函数调用之前需要满足何种条件:比如,参

2、数word不可以为NULL2. Postcondition:函数调用之后需要满足何种条件:比如,参数word被加入到 WordList 的成员 m_wordList 中,m_wordList 元素个数+13. Invariant:函数调用之前之后总是需要满足的条件是什么:比如,m_wordList中 的单词总是以升序排列契约式设计这个概念是Bertrand Meyer提出的,并在Eiffel Programming Language 这本书中有详细的描述,Eiffel语言本身对契约式设计支持也非常好,有兴趣的朋友可以 尝试并比较一下。.NET 4.0 中的 Contracts在.NET 4.0

3、中引入了对契约式设计的支持,我们来看一下,如果上面那个例子用4.0 中的契约式设计功能应该如何编写:1: public void WordList.Insert(string word)2: 3: CodeContract.Requires(word != null);4: CodeContract.Ensures(CodeContract.OldValue(_words.Count) + 1 = _words.Count);5: CodeContract.EnsuresOnThrow(CodeContract.OldValue(_words.Count)= _words.Count);7:

4、8:其中:1. Contract.Requires 是 Precondition2. Contract.Ensures 是 PostCondition3. Contract.EnsuresOnThrow是 Postcondition, 和 Ensures 的区别是这是在 Throw 的情况下需要满足的Postcondition可以看到,Contracts在被显式的放在代码当中,而不仅仅是说明性的文字,那这样有 什么好处呢?1. 提供了运行时支持:这些Contracts都是可以被运行的,并且一旦条件不被满足, 会弹出类似Assert的一样的对话框报错,如下:Assertion Failed: A

5、bDrt=QuitF RetryDebug, Ignore =ContinuePrecondition Failed: capacity 0:I at _ContractsRuntime. TriggerFailure(ContractFailureKind kindString messagej String userMessagej String conditionTextj Exception inner,at _ContractsRuntime.ReportFailurefContractFailurekind kind, String messagej String conditio

6、nText, Izeption inner)at _ContractsRuntime. Requires(Eioolean condition; String messagej String conditionText)af WordList. .ctor(Int32 capacity) C:Documents and 5ettingsyzhaMy DocumentsHVisual Studio10Prciject5TestContractTestContractProgram.c(i5)at Program.Main(5tring args) CiDocuments and 5ettings

7、yzhaMy DocumentsVlsual Studio10Project5T estContractT estContractProgram. cs(69)at AppDomain. _nExecuteA55embly(RuntimeAssemHy asembly 5tnng args)at AppDomain. ExecuteAssemblytring assemblyFilej Evidence assemblySecurity; 5trmg args)at HostProc.RunUsersAssembly()at ThreadHelper. Thread5tart_Context(

8、Obect state)at Executioncontext. Run(ExecutionContex executionContex ContextCallback callbackj Object-tatej Boolean ignore5yncC at Executioncontext. Run(ExecutionContext exiecutionContextj ContextCallback callbackj Object state)at ThreadHelper.Thread5tart()Abort E,etry i亟店j|2. 提供了静态分析支持:通过静态分析Contra

9、cts,静态分析工具可以比较容易掌握 函数的各种有关信息,甚至可以作为Intellisense看到这里,可能有些朋友会有一些疑问:Contracts可以做条件检查并且弹出类似 Assert的对话框,这个和Assert有何区别呢?其实,Contracts和Assert的区别主要在于:1. Contracts的意图更加清晰,通过不同的Requires/Ensures等等调用,代表不同类 型的条件,比单纯的Assert更容易理解和进行自动分析2. Contracts的位置更加统一,将3种不同条件都放在代码的开始处,而非散见在函 数的开头和结尾,便于查找和分析。3. 不同的开发人员、不同的小组、不同的

10、公司、不同的库可能都会有自己的Assert, 这就大大增加了自动分析的难度,也不利于开发人员编写代码。而Contracts直接被.NET 4.0 支持,是统一的。当然了,Contracts也和Assert有一些非常类似的地方,比如Contracts和Assert都 可以运行时检查错误,也可以在随意的在代码中关闭打开。VS中支持Contracts的几种不 同的典型配置:1. CONTRACTS_FULL:打开所有 Contracts2. CONTRACTS_PRECONDITIONS:仅有 Precondition3. RequireAlways Only:仅有 RequireAlways。Re

11、quireAlways 的意思等会讲到这些选项都可以通过项目的Code Contracts页面来进行修改,这个页面是通过安装 Contracts工具包获得的:ApplicationConfiguration: Active (Debug)Platform: ActiveBuildBuild EventsDebugResourcesServicesSettingsReference PathsSigningRuntime Checking寸;E疝见贝.B.煎.血,溢.匚就如成.匚h熙ki话 FullCustom Rewriter MethodsAssembly I Clas1.2.20513.1

12、:Onlv Public Surface Contracts5 Assert on Contract Failure Call-site Requires Checkingf Static CheckingPerform Static Contract CheckingI linplicit No.n-Nul! 0bligatiopsImplicit Array Bound? ObligationsIP Checkin Background 厂 Show squigglieImplicit Arithmetic Obligations宠匚皿F Bazine. |PublishContract

13、Reference AssemblyCode AnalysisBuild a Contract Reference AssemblyAdvancedCcide Contracts,LihPatfe AfA/yyAlternate mscorlibUVj ii ccmr卜,oh fl Oj j在这里提醒大家一下,在使用Contracts功能之前,一定要下载最新版的Contracts 开发工具包:http:/ 装这个工具包将无法使用Contracts的功能。刚才我们谈到了 Requires和Ensures两种条件,这里把.NET 4.0中的最常用的几种 Contracts 列一下:1. Requi

14、res:函数入口处必须满足的条件2. Ensures:函数出口处必须满足的条件3. Invariants:所有成员函数出口处都必须满足的条件4. Assertions:在某一点必须满足的条件5. Assumptions :在某一点必然满足的条件,用来减少不必要的警告信息其中,对于Invariant需要稍作一点说明。因为Invariant是需要对每个成员函数都需 要起到作用,显然如果把这个条件放在每个函数的末尾处可以起到这个效果,但是这么做显 得比较笨。.NET 4.0中采取的方式是这样的:使用某个成员函数作为Invariant,上面标记 ContractInvariantMethod属性,然后

15、在这个成员函数里面用Contracts.Invariant来指定 每一条Invariant条件。这样,Invariant就会对每个函数起作用了。同时,这个Invariant 方法也应该标记上PureAttribute属性,表明该函数不存在副作用(不会修改对象的状态)Contracts的奥秘看到这里,不知道有些朋友发现没有,不管是Ensures还是Invariant,它们的位置并 不是代码应该所存在的位置。对于Ensures来讲,它是函数出口条件,那么必然在出口时候 被调用,但是为什么Ensures写在前面呢?同样的,Invariant是对每个函数起作用,如果 单独写一个函数作为Invariant怎么保证它会被每个函数调用到呢?其实这些都是很合理的 问题。首先,Ensure和Invariant的这种写法是很合理的,原因之前也提到过了,剩下的 问题是,.NET如何保证这些条件会在正确的时候被执行。其实,在编译的时候,Contra

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号