如何提高代码的健壮性有几种特性 健壮性

多种动态二进制代码插入框架的研究与分析-免费论文
欢迎来到网学网学习,获得大量论文和程序!
多种动态二进制代码插入框架的研究与分析
【VC++开源代码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。&&&&网学会员整理了VC++开源代码-多种动态二进制代码插入框架的研究与分析 - 技术总结的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
邮局订阅号82-946360元/年技术创新软件时空《PLC技术应用200例》您的论文得到两院院士关注多种动态二进制代码插入框架的研究与分析ResearchndAnlysisofMnifoldDynmicBinaryInstrumentationFrmeworks赵钊12袁勇1车向前1何永君3元慧慧12ZHAOZhaoYUANYongCHEXiang-qianHEYong-junYUANHui-hui摘要:随着软件系统功能的日益强大软件编写的代码量呈指数趋势增长程序错误控制和程序性能优化变得越来越困难。&&&&为了在代码量增加的情况下有效控制程序质量改进程序性能程序员大多采用动态二进制分析工具进行程序分析。&&&&动态二进制代码插入框架有效地简化了动态二进制工具的构建因此准确掌握每种动态二进制代码插入框架的特征成为准确构建不同工具的前提。&&&&本文通过对常用的五种二进制代码插入框架进行深入研究分析总结归纳了每种框架的特点和特定情况下的适用性为在工具构建过程中进行框架的准确有效选择提供了参考。&&&&关键词:动态二进制分析程序分析动态二进制插入中图分类号:TP311.56文献标识码:AAbstract:Alongwiththefunctionofthesoftwaresystembecameincreasinglystrongthecodeamountofthesoftwaresystemincreas-esexponentiallyitismoredifficulttocontroltheprogram’serrorandoptimizetheprogramsperformance.Inordertoeffectivelycontroltheprogramsqualityandimproveontheprogramsperformancetheprogrammersmostlyusedynamicbinaryanalysistooltodotheprogramanalysis.Thedynamicbinaryinstrumentationframeworkeffectivelypredigestthedesignofthedynamicbinaryanal-ysistoolsowellandtrulymasteringthecharacterofeachdynamicbinaryinstrumentationframeworkbecomesthepreconditionofdesigningdifferenttools.Thispaperhomeresearchedandanalyzedfivedynamicbinaryinstrumentationframeworkswhichwereincommonusesummarizedthecharacterofeachframeworkandtheapplicabilityinthegiveninstanceprovidedeffectivereferenceforexactlyframeworkchoosingintheprocessofthetooldesign.Keywords:DynamicbinaryanalysisProgramanalysisDynamicbinaryinstrumentation文章编号:004-3-引言随着软硬件系统变得日益复杂程序员的编程量成倍的增长但是一般的编程工具和环境只提供了对简单错误的防范因此程序员大多使用程序分析工具来改进其程序的质量。&&&&其中动态二进制分析DBA工具是使用较多的一种工具主要用于分析程序运行过程中机器代码级的程序。&&&&动态二进制代码插入DBI框架可以简化DBA工具的构建而当前对DBI的关注主要集中在它的性能上而对其它的能力关注很少。&&&&本文从程序分析方法的研究入手深入研究比较了五种常用DBI框架的性能、健壮性、可用性等特点。&&&&2程序分析方法分类程序分析对于改进程序的质量、正确性和速度具有很大的帮助。&&&&目前提出的程序分析方法众多侧重点各不相同本文主要介绍两种基本的程序分析的分类方法。&&&&根据程序分析进行的时机可以将程序分析方法简单的分为静态分析方法和动态分析方法。&&&&静态分析不实际运行程序只读取程序对其进行分析。&&&&动态分析在目标程序运行时进行执行动态分析时要在目标程序中插入分析代码利用分析代码执行某些操作如检测性能或确定bug。&&&&动态分析使用程序执行时的实际值因此精确性比静态分析好。&&&&程序分析的另一种分类方法是根据拟分析的目标代码的类型划分为源代码分析和二进制代码分析。&&&&源代码分析在程序的源代码层次上进行直接对源代码的程序表达式及数据结构进行分析。&&&&二进制分析在机器代码级上进行分析可执行代码的中间表达式。&&&&二进制分析一般用在和机器相关的方面如指令、寄存器和存储器的分配等。&&&&如图1所示这两种分类方法并不是独立的可以交叉形成静态源代码分析、动态源代码分析、静态二进制分析和动态二进制分析等四种分析方法。&&&&本文主要讨论与动态二进制分析相关的代码插入相关技术。&&&&图1四种程序分析方法3动态二进制代码插入方法在动态二进制分析过程中需要在目标程序中插入分析代码从而检测性能发现bug。&&&&对于DBA根据代码插入的时机有两种代码插入技术:静态二进制插入SBI和动态二进制插入DBI。&&&&静态二进制插入在目标程序运行之前执行而动态二进制插入在程序运行阶段执行。&&&&DBA工具通常利用DBI将分析代码在运行阶段添加到目标程序的源代码中实现。&&&&DBI技术有两个显著的优点:首先目标程序不需要做预先准备其次DBI方法适用于所有的目标代码因此DBI成为实现动态二进制分析工具最好的技术。&&&&1.中国人民解放军61828部队2.中国人民解放军61741部队3.中国人民解放军61377部队赵钊:助理工程师硕士189--技术创新《微计算机信息》管控一体化2010年第26卷第4-3期360元/年邮局订阅号82-946《现场总线技术应用200例》软件时空但是DBI技术存在两个缺点:DBI难于实现同时在运行时插入分析代码的开销过大。&&&&通用DBI框架的出现极大的解决了这些问题。&&&&DBI框架将较难的代码集成在框架中使得新的复杂DBA工具不需要全部重新编写。&&&&其次DBI框架进行了精心优化从而降低了执行代码插入的时间开销。&&&&4动态二进制代码插入框架的分析与比较本节选取了五种典型的可以获得源程序或二进制程序的DBI框架进行实验分析研究了这些DBI框架的可执行平台健壮性性能工具构建及应用特性等基本方面总结了每种DBI框架的特征和适用范围。&&&&4.1ValgrindValgrind是一个适用于构建DBA工具的DBI框架最早发布于2002年。&&&&它是一个健壮而成熟的系统已经被数以千计的程序员用于不同的软件设计过程中如OfficeMySQL等。&&&&通过实验研究分析Valgrind的基本特征如下:可执行平台:x86/Linux。&&&&健壮性:较高可以运行具有数百万行代码的程序。&&&&性能:由于目标程序中插入了分析代码程序的运行速度会受到一定的影响。&&&&当程序在Valgrind的控制下运行时速率降低倍数在2-10之间增加了分析代码的目标代码量扩充系数在.56.0之间。&&&&工具构建:当前基于Valgrind构建的DBA工具较多包括三个存储器检测器一个cache分析器一个动态数据流跟踪器一个堆分析器和一个数据路径检测器。&&&&应用特性:Valgrind最强的功能在于它适合构建heavy-weightDBA工具。&&&&Valgrind也可以用于构建lightweightDBA工具但是它们的性能比使用其他更快的DBI框架构建如Dy-namoRIO的工具差。&&&&.2ShadeShade的首次发布是在1991年属于早期的开创性的DBI框架用于构建简单的跟踪和分析工具。&&&&它是第一个具有对分析代码的控制权以及第一个将分析代码有效的插入到目标代码的框架。&&&&经过实验分析得到的Shade的基本特征如下:可执行平台:Shade可以在SPARC/Solaris上运行SPARC.V8/Solaris和SPARC.V9/Solaris以及MIPS/UMIPSV二进制程序。&&&&同时有一个shade版本可以在SPARC/Solaris运行x86/So-laris二进制程序。&&&&健壮性:Shade使用动态二进制编译和缓存可以运行比较大的程序―――包括它的动态转换工具和框架本身。&&&&性能:Shade在SPARC.V8上运行SPARC.V8程序比没有进行代码插入的时候慢2.8到6.1倍代码量的扩充倍数为.1.7。&&&&工具构建:利用Shade可以构建的分析和跟踪工具较多如指令计数器、cache模拟器、分支分析器等。&&&&应用特性:Shade给出了很多重要的DBI特性并且影响广泛但是它现在已经不再使用其它框架有比它更好的性能及灵活性。&&&&.3DynamoRIODynamoRIO首次发布是在2001年是一个动态二进制优化及代码插入框架。&&&&它只对控制流指令进行修改几乎直接工作在原始的x86代码上。&&&&经过实验分析可以得到DynamoRIO的如下特征:可执行平台:X86/Win32和x86/LINUX。&&&&健壮性:DynamoRIO使用动态二进制编译和缓存。&&&&在执行Win32程序时健壮性较高可以运行诸如Office之类的程序执行Linux程序的健壮性稍微差一些。&&&&性能:DynamoRIO具有卓越的性能在不进行任何优化的情况下速率降低的典型倍数只在1.01.5之间。&&&&当使用一些辅助peephole优化时它运行某些程序的速度可能会更快。&&&&工具构建:利用DynamoRIO构建了多种动态优化器如通过检查程序中所有跳转的安全性防止安全攻击的工具。&&&&应用特性:DynamoRIO的高速率和对目标源代码的准确表示使得它成为构建DBA工具进行动态二进制优化实验的理想选择。&&&&.DynInstDynInst发布于1996年它的设计目标是分析长时间运行的科学程序因此它可以将分析代码插入正在运行的程序中或将分析代码从正在运行的程序中去除。&&&&从实验分析得到DynInst的特征如下:可执行平台:DynInst可以支持多种平台如x86/Linuxx86/Win32IA6/LinuxSPARC/SolarisPowerPC/AIXAlpha/AIXAlpha/Tru6和MIPS/IRIX。&&&&健壮性:DynInst的健壮性是很强的可以运行诸如Office之类的程序。&&&&性能:由于DynInst具有实时添加/去除分析代码的特性因此没有能够得到增加分析代码以后速率降低的实际范围但是速率降低是肯定的。&&&&当去掉分析代码后会使一些工具的速率提高。&&&&工具构建:基于DynInst构建了许多分析工具、调试工具和计算性操作工具。&&&&它构成了Paradyn并行分析工具的框架内核具有支持大规模并行程序的特性。&&&&应用特性:DynInst的显著优点是可以在已经处于运行状态的程序上增加/去除分析代码这个特性在分析长时间运行的科学应用程序时是很有益的。&&&&DynInst的另一个显著之处在于它支持大部分的操作系统平台。&&&&.5WalkaboutWalkabout是一个用于动态二进制转换实验的框架被设计为具有高度的通用性和具体的机器无关。&&&&Walkabout有两个主要的部分。&&&&第一个部分是一个插入分析代码的解释程序产生器。&&&&它以三个文件作为输入:机器语法描述文件机器语义描述文件和一个以某种格式描述分析代码的INSTR的文件。&&&&INSTR文件会为SPARC.V8或x86生成一个解释程序C或Java形式。&&&&第二个部分称为PathFinder:它使用动态编译和缓存以及动态二进制优化技术来加速生成解释程序。&&&&可执行平台:Walkabout在SPARC.V8/SolarisSPARC.V9/So-laris和x86/Linux上运行SPARC.V8/Solaris和x86/Linux二进制程序。&&&&但是PathFinder部件只能在SPARC.V9/Solaris上运行SPARC.V8/Solaris代码。&&&&健壮性:Walkabout的健壮性足以满足SPECCPU95和CPU2000基准测试程序的需要。&&&&性能:Walkabout生成的插入分析代码的程序解释器的性能很差。&&&&在SPARC.V8上解释SPARC.V8代码时速率降低的倍数在139261之间。&&&&但是PathFinder可以和解释器结合起来执190邮局订阅号82-946360元/年技术创新软件时空《PLC技术应用200例》您的论文得到两院院士关注行动态二进制编译和跟踪优化。&&&&PathFinder的性能变化较大的速率降低倍数在0.6-175之间。&&&&工具构建:Walkabout可以用于构建基本的跟踪工具执行存储器访问跟踪和指令跟踪。&&&&应用特性:Walkabout变化不定的性能和对代码插入相对较弱的支持使得它与其他框架相比并不适合构建DBA工具。&&&&表1给出了以上五种DBI框架基本信息的简单概括。&&&&表1五种框架基本信息的总结比较通过对DBI框架进行研究分析可以看到每个DBI框架都有一定的重要特性:灵活的工具编写、健壮性、代码插入能力或性能。&&&&对于利用DBI框架构建DBA工具来说健壮性和性能是很重要的工具的设计在很大程度上依赖于这两个特性。&&&&在任何的框架或工具中各种性能都要达到一定的平衡当对不同的框架和工具进行比较时要考虑所有相关的特性。&&&&对于构建lightweight型DBA工具Valgrind不如那些面向性能的框架适用如DynamoRIO等。&&&&对于构建heavyweight类型DBA工具Valgrind则具有唯一合适的特性集合:工具编写相对简单能够提供强大的代码插入能力和其它合适的特性。&&&&5结论随着对DBI和DBA技术研究的深入会有更多更具特点DBI框架出现。&&&&对每种DBI框架进行详细的分析研究可以更好地掌握每种框架的特征针对实际工作需要对其进行有效利用。&&&&本文通过对五种DBI框架的深入研究分析归纳总结了每种工具的性能、健壮性等特点为在实际应用工作中对框架进行正确的选用和有效的使用提供了参考。&&&&创新观点:本文系统分析研究多种DBI框架总结归纳了每种框架的特点和特定情况下的适用性为在工具构建过程中进行框架的准确有效选择提供了参考。&&&&参考文献1陈建芳.分析程序的必备工具:介绍一种带VC功能的反汇编程序.微计算机信息..2NicholasNethercoteJulianSeward.Valgrind:AFrameworkforHeavyweightDynamicBinaryInstrumentationC.ProceedingsofPLDI’07.SanDiegoUSA.June2007.3NicholasNethercote.DynamicBinaryAnalysisandInstrumentationorBuildingToolsisEasyD.UniversityofCambridge.2004.4V.BalaE.DuesterwaldS.Banerjia.Dynamo:AtransparentdynamicoptimizationsystemC.ProceedingsofPLDI.VancouverCanadaJune2000.5N.NethercoteJ.Seward.Valgrind:AprogramsupervisionframeworkJ.ENTCSBobCmelikDavidKeppel.Shade:Afastinstruction-setsimulatorforexecutionprofilingC.ProceedingsoftheACMSIGMETRICSInternationalConferenceonMeasurementandModelingofComputerSystems:128-137.TennesseeUSAMay1994.7DerekBrueningTimothyGarnettSamanAmarasinghe.AninfrastructureforadaptivedynamicoptimizationC.ProceedingsoftheInternationalSymposiumonCodeGenerationandOptimizationCGO03:265276.CaliforniaUSAMarch2003.8BryanBuckJeffreyK.Hollingsworth.AnAPIforruntimecodepatchingJ.JournalofHighPerformanceComputingApplications144:317329.Winter2000.9CristinaCifuentesBrianT.LewisDavidUng.WalkaboutAretargetabledynamicbinarytranslationframework.TechnicalReportTR2002106SunMicrosystemsLaboratories.CaliforniaUSAJanuary2002.作者简介:赵钊男1982年4月出生河北定州人助理工程师硕士。&&&&年信息工程大学信息工程学院硕士研究生2008年解放军61828部队助理工程师主要研究方向:软件模拟、网络通信.Biography:ZHAOZhaowhocomesfromDingzhoucityHebeiprovincegainedthemastersdegreeintheyearof2008.NowI’mworkinginthe61741troopsofPLA.Myprimaryresearchfieldissoftwaresimulationandnetworkcommunications.844200新疆中国人民解放军6188部队赵钊袁勇车向前元慧慧100081北京中国人民解放军61741部队赵钊元慧慧814048深圳中国人民解放军61377部队何永君61741troopsofPLAXinjiang84400ChinaZHAOZhaoYUANYongCHEXiang-qianYUANHuihui61741troopsofPLABeijing100081ChinaZHAOZhaoYUANHuihui61377troopsofPLAShenzhen814048ChinaHEYongjun通讯地址:84400新疆疏勒总参056工程办公室喀什站赵钊收稿日期:修稿日期:上接第209页5HuXHCerconeN.LearninginRelationalDatabase:ARoughSetApproachJ.ComputationalIntelligence337.6王国胤.Rough集理论与知识获取M.西安:西安交通大学出版社2001.作者简介:陈曦1963男汉族福建莆田人长沙理工大学计算机与通信工程学院教授硕士生导师硕士主要研究方向为人工智能、数据挖掘赵明1983男湖南益阳长沙理工大学硕士研究生主要研究领域为数据挖掘张颖1985女福建福州长沙理工大学硕士研究生主要研究领域为数据挖掘雷健1985男湖南株洲长沙理工大学硕士研究生主要研究领域为数据挖掘。&&&&Biography:CHENXi1963MailtheHannationalityFu-jianCollegeofComputerandCommunicationEngineeringChangshaUniversityofScienceTechnologyProfessorMas-terArtificialintelligenceDatamining.410076湖南长沙长沙理工大学计算机与通信工程学院陈曦赵明张颖雷健CollegeofComputerandCommunicationEngineeringChangshaUniversityofScienceTechnology410076ChinaCHENXiZHAOMingZHANGYingLEIJian通讯地址:410114长沙理工大学计算机与通信工程学院云塘校区陈曦收稿日期:修稿日期:91
【】【】【】【】【】开发一个基于 SOA 的集成框架 —— 特性 - 技术翻译 - 开源中国社区
开发一个基于 SOA 的集成框架 —— 特性
【已翻译100%】
英文原文:
推荐于 5年前 (共 8 段, 翻译完成于 04-24)
参与翻译&(1人)&:
几年前有个客户请我帮助他们更好的使用他们的集成层(integration layer)。自那以后我和我的团队一直在开发对其支持的框架。这是关于我们框架开发系列博客的第四篇,讨论它所提供的特性。上一次声明的,关于创建blocks,暂时延期。
目前为止,我已经讨论了关于开发活动的&与&,但现在我想更多的关注于框架本身,以及它给那些使用它的程序带来了什么。
&翻译得不错哦!
一旦一个参与方(可能是服务消费者或者服务提供方)连接到我们的框架,它能直接从我们提供的丰富的开箱即用的函数中获得好处。这些“通用特性”正是我们期待从一个(逻辑的)ESB获得的东西,它们部分的基于。
由于我们的项目是敏捷驱动的,特性仅在它们被需要的时候开发。有时候,经过设计和开发阶段,我们发现了一个更好的处理方法,有时候猜想到一个特性可能会发生的问题,会被以一种完全不同的,超越我们处理范围的方法解决。但最终我们成功的实现了大约20个特性,可以粗略的被分为五种类型:路由,健壮性,安全性,转换和数据存储。
&翻译得不错哦!
我们一个主要的目标是将消息从A传送到B,但不需要A知道现在B存在于哪里。为了做到这一点,我们对WEB服务地址(WS-Addressing)标准做了扩展使用。我们框架中的一个组件,路由服务,使用消息头部的信息去决定下一跳(hop)是什么(在这个案例中hop是另一个框架组件)。大多数时间里,一个消息在它进入集成层的时候被交付到后方,我们称之为简单路由。
然而,一旦需要执行一些特殊的动作时(比如像数据模型转换),消息会绕道到达某个不与外部世界联系的框架组件。我们将其归类为中间服务,它们对周围情况不知——这意味着它们没有任何线索,任何关于它们被调用的这个上下文的线索。消息继续它的路径所必须用到的信息,同样也是地址头部的一部分,这使之成为高级路由。
&翻译得不错哦!
一种特殊类型的高级路由是分发,它通过以最基础的形式使用WEB服务通知(WS-Notification), 使得将一个消息在同一时间发送给数个订阅者成为可能。最后优先级路由是一个确保一个消息在其它消息之前的特性,这么说吧——当处理一个柜台边客户等待的服务,同时又有大量的负载正在处理,这个时候它是非常有用的。
在投递消息的时候没有错误,或者至少能在它发生的时候处理那个情况(异常管理),显然这是极其重要的。当我们接收到一个消息时的第一件事情就是检查它是否符合我们实施的工业的和设计的标准(技术验证)。有时候消费者/发布者不想等待(函数式的)回答,但仍然想获得消息是否在技术上有效的信息,那种情形下我们给他发送一个说明那一点的响应(技术验收)。
&翻译得不错哦!
我们有两个特性处理最大负载:限流保证了集成层只接收它可以处理的那些,而缓存保证了我们不会淹没于连接的应用。与第二个类似的是延迟交付,用在我们预先知道后台不可及的时候。
但目前这些类型特性中最重要的是担保交付。我们试验了双向的变化(使用服务可靠消息传递WS-RM)但最终选定了单向的实现,这意味着在我们发送消息之前我们首先是存储它,如果我们收到一个HTTP错误代码我们会再次发送它。
最后(实际上至少因为它很难被使用)具有对发送消息的句法校验是可能的。但正如我们喜欢遵循的波斯托定律(Postel’s law也称作健壮性法则),我们感到消费者有责任确保消息首先是有效的(你能够想象从我们的观点来说这需要一些推销)。唯一的例外就是载荷被框架改变的时候。
&翻译得不错哦!
每个想要连接到集成层的应用需要声明自己,通过使用WEB服务安全用户名令牌(WS-Security UsernameToken) (身份认证)的方式。 对我们暴露出来的大多数服务那已经足够,在极少数案例中,这种应用必须具有明确的许可(授权)。
不是说内部使用(只有在我们收到某个外部客户的请求时)就是可信的,我们要求消息头部和载荷的某个部分具有署名。
&翻译得不错哦!
假设不是所有的应用都连接到框架'说同样的语言'(如以前的博客中所提到的),明显有数据模型转换的需求——我们最常被使用的特性之一。一个不太普通的是分裂特性,它使得一个大的消息被划分成为一些小的部分成为可能。
最后一些特性对已经提到的那些更具有支持的作用。我们提供使用于测试和bug查找会话中的日志功能,以及在需要存储整个消息时的持久化功能。后者经常与再发送结合起来使用(这对上面描述的有保证的交付特性而言是必须的),但也在审计的需求中使用。
&翻译得不错哦!
这些特性的大多数从我们框架的第一个版本就一直伴随着,并且经历时间考验证明了它们的通用性质。在一些案例中我们不得不做一些改动,即使现在也有一两个特性我们可能在未来用不同的方式实现。还有一系列的额外的特性,但已经非常少,这被我看作是在这里我们已经有了完美结束的标记。
这就是第四篇;下一次我将谈论一些我们提供给我们项目团队的,更多特定范围内的成果。
&翻译得不错哦!
我们的翻译工作遵照 ,如果我们的工作有侵犯到您的权益,请及时联系我们51CTO旗下网站
Swift 2.0初探:值得注意的新特性
转眼间,Swift已经一岁多了,这门新鲜、语法时尚、类型安全、执行速度更快的语言已经渐渐的深入广大开发者的心。我同样也是非常喜爱这门新的编程语言。
作者:来源:devtalking| 15:48
转眼间,Swift已经一岁多了,这门新鲜、语法时尚、类型安全、执行速度更快的语言已经渐渐的深入广大开发者的心。我同样也是非常喜爱这门新的编程语言。
今年6月,一年一度的WWDC大会如期而至,在大会上Apple发布了Swift 2.0,引入了很多新的特性,以帮助开发者能更快,更简单的构建应用。我在这里也说道说道Swift 2.0中值得大家注意的新特性。
guard语句和if语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么。但与if语句不同的是,guard语句只会有一个代码块,不像if语句可以if else多个代码块。
那么guard语句的作用到底是什么呢?顾名思义,就是守护。guard语句判断其后的表达式布尔值为false时,才会执行之后代码块里的代码,如果为true,则跳过整个guard语句,我们举例来看看。
我们以今年高考为例,在进入考场时一般都会检查身份证和准考证,我们写这样一个方法:
func&checkup(person:&[String:&String!])&{&&&guard&let&id&=&person[&id&]&else&{&print(&没有身份证,不能进入考场!&)&return&}&&&guard&let&examNumber&=&person[&examNumber&]&else&{&print(&没有准考证,不能进入考场!&)&return&}&&&print(&您的身份证号为:\(id),准考证号为:\(examNumber)。请进入考场!&)&&}&checkup([&id&:&&123456&])&&checkup([&examNumber&:&&654321&])&&checkup([&id&:&&123456&,&&examNumber&:&&654321&])&&
上述代码中的第一个guard语句用于检查身份证,如果检查到身份证没带,也就是表达式为false时,执行大括号里的代码,并返回。第二个guard语句则检查准考证。
如果两证齐全,则执行最后一个打印语句,上面的两个guard语句大括号内的代码都不会执行,因为他们表达式的布尔值都是true。
这里值得注意的是,id和examNumber可以在guard语句之外使用,也就是说当guard对其表达式进行验证后,id和examNumber可在整个方法的作用域中使用,并且是解包后的。
我们再用if else语句写一个类似的方法:
func&checkupUseIf(person:&[String:&String!])&{&&if&let&id&=&person[&id&],&let&examNumber&=&person[&examNumber&]&{&print(&您的身份证号为:\(id),准考证号为:\(examNumber)。请进入考场!&)&}&else&{&print(&证件不齐全,不能进入考场!&)&}&&print(&您的身份证号为:\(id),准考证号为:\(examNumber)&)&&&}&checkupUseIf([&id&:&&123456&])&&checkupUseIf([&examNumber&:&&654321&])&&checkupUseIf([&id&:&&123456&,&&examNumber&:&&654321&])&&
我们可以看到用if else实现的方法显然不如guard实现的那么精准。而且id和examNumber的作用域只限在if的第一个大括号内,超出这个作用域编译就会报错。
通过上述两个小例子不难看出,guard语句正如一个称职的守卫,层层把关,严防一切不允许发生的事,并且让代码具有更高的可读性,非常棒。
在Swift 1.0时代是没有异常处理和抛出机制的,如果要处理异常,要么使用if else语句或switch语句判断处理,要么使用闭包形式的回调函数处理,再要么就使用NSError处理。以上这些方法都不能像Java中的try catch异常控制语句那样行如流水、从容不迫的处理异常,而且也会降低代码的可读性。当Swift 2.0到来后,一切都不一样了。
在Swift 2.0中Apple提供了使用throws、throw、try、do、catch这五个关键字组成的异常控制处理机制。下面我们来举例看看如何使用,我用使用手机刷朋友圈为例。
首先我们需要定义异常枚举,在Swift 2.0中Apple提供了ErrorType协议需要我们自定义的异常枚举遵循:
enum&WechatError:&ErrorType&{&case&NoBattery&&case&NoNetwork&&case&NoDataStream&&}&
我们定义了导致不能刷微信的错误枚举&wechatError。然后定义一个检查是否可以刷微信的方法checkIsWechatOk():
func&checkIsWechatOk(isPhoneHasBattery:&Bool,&isPhoneHasNetwork:&Bool,&dataStream:&Int)&throws&{&&guard&isPhoneHasBattery&else&{&throw&WechatError.NoBattery&}&&guard&isPhoneHasNetwork&else&{&throw&WechatError.NoNetwork&}&&guard&dataStream&&&50&else&{&throw&WechatError.NoDataStream&}&&}&
这里注意,在方法名后有throws关键字,意思为该方法产生的异常向上层抛出。在方法体内使用guard语句对各种状态进行判断,然后使用throw关键字抛出对应的异常。然后我们定义刷微信的方法:
func&playWechat(isPhoneHasBattery:&Bool,&isPhoneHasNetwork:&Bool,&dataStream:&Int)&{&&do&{&try&checkIsWechatOk(isPhoneHasBattery,&isPhoneHasNetwork:&isPhoneHasNetwork,&dataStream:&dataStream)&print(&放心刷,刷到天昏地暗!&)&}&catch&WechatError.NoBattery&{&print(&手机都没电,刷个鬼啊!&)&}&catch&WechatError.NoNetwork&{&print(&没有网络哎,洗洗玩单机吧!&)&}&catch&WechatError.NoDataStream&{&print(&没有流量了,去蹭Wifi吧!&)&}&catch&{&print(&见鬼了!&)&}&&}&playWechat(true,&isPhoneHasNetwork:&true,&dataStream:&60)&&playWechat(true,&isPhoneHasNetwork:&false,&dataStream:&60)&&playWechat(false,&isPhoneHasNetwork:&true,&dataStream:&60)&&playWechat(true,&isPhoneHasNetwork:&true,&dataStream:&30)&&
上述的代码示例中,首先检查是否可以刷微信的方法前使用try关键字,表示允许该方法抛出异常,然后使用了do catch控制语句捕获抛出的异常,进而做相关的逻辑处理。
这套异常处理机制使Swift更加的全面和安全,并且提高了代码的可读性,非常棒。
在Swift 1.0 时代,协议(Protocol)基本上类似一个接口,定义若干属性和方法,供类、结构体、枚举遵循和实现。在Swift 2.0中,可以对协议进行属性或者方法的扩展,和扩展类与结构体类似。这让我们开启了面向协议编程的篇章。
Swift中,大多数基础对象都遵循了CustomStringConvertible协议,比如Array、Dictionary(Swift 1.0中的Printable协议),该协议定义了description方法,用于print方法打印对象。现在我们对该协议扩展一个方法,让其打印出大写的内容:
var&arr&=&[&hello&,&&world&]&print(arr.description)&&extension&CustomStringConvertible&{&var&upperDescription:&String&{&return&&\(self.description.uppercaseString)&&}&}&
print(arr.upperDescription) // &[HELLO, WORLD]&
如果在Swfit 1.0时代,要想达到上述示例的效果,那么我们需要分别对Array、Dictionary进行扩展,所以协议的扩展极大的提高了我们的编程效率,也同样使代码更简洁和易读。
打印语句的改变
在Swift1中,有'println()'和'print()'两个在控制台打印语句的方法,前者是换行打印,后者是连行打印。在Swift2中,'println()'已成为过去,取而代之的是他俩的结合体。如果你想做换行打印,现在需要这样写:
print(&我要换行!&,&appendNewline:&true)&
available检查
作为iOS开发者,谁都希望使用最新版本iOS的Api进行开发,省事省力。但常常事与愿违,因为我们经常需要适配老版本的iOS,这就会面临一个问题,一些新特性特性或一些类无法在老版本的iOS中使用,所以在编码过程中经常会对iOS的版本做以判断,就像这样:
if&NSClassFromString(&NSURLQueryItem&)&!=&nil&{&&}&else{&&}&
以上这只是一种方式,在Swift 2.0之前也没有一个标准的模式或机制帮助开发者判断iOS版本,而且容易出现疏漏。在Swift 2.0到来后,我们有了标准的方式来做这个工作:
if&#available(iOS&8,&*)&{&&let&queryItem&=&NSURLQueryItem()&&}&else&{&&&}&
这个特性让我们太幸福。
do-while语句重命名
经典的do-while语句改名了,改为了repeat-while:
var&i&=&0&repeat&{&i++&print(i)&}&while&i&&&10&
个人感觉更加直观了。
defer关键字
在一些语言中,有try/finally这样的控制语句,比如Java。这种语句可以让我们在finally代码块中执行必须要执行的代码,不管之前怎样的兴风作浪。在Swift 2.0中,Apple提供了defer关键字,让我们可以实现同样的效果。
func&checkSomething()&{&&print(&CheckPoint&1&)&doSomething()&print(&CheckPoint&4&)&&}&func&doSomething()&{&&print(&CheckPoint&2&)&defer&{&print(&Clean&up&here&)&}&print(&CheckPoint&3&)&&}&checkSomething()&&
上述示例可以看到,在打印出&CheckPoint 2&之后并没有打印出&Clean up here&,而是&CheckPoint 3&,这就是defer的作用,它对进行了print(&Clean up here&)延迟。我们再来看一个I/O的示例:
&func&writeSomething()&{&&let&file&=&OpenFile()&&let&ioStatus&=&fetchIOStatus()&guard&ioStatus&!=&&error&&else&{&return&}&file.write()&&closeFile(file)&&}&
上述示例是一个I/O操作的伪代码,如果获取到的ioStatus正常,那么该方法没有问题,如果ioStatus取到的是error,那么会被guard语句抓到执行return操作,这样的话closeFile(file)就永远都不会执行了,一个严重的Bug就这样产生了。下面我们看看如何用defer来解决这个问题:
&func&writeSomething()&{&&let&file&=&OpenFile()&defer&{&closeFile(file)&}&&let&ioStatus&=&fetchIOStatus()&guard&ioStatus&!=&&error&&else&{&return&}&file.write()&&}&
我们将closeFile(file)放在defer代码块里,这样即使ioStatus为error,在执行return前会先执行defer里的代码,这样就保证了不管发生什么,最后都会将文件关闭。
defer又一个保证我们代码健壮性的特性,我非常喜欢。
Swift 2.0中的新特性当然不止以上这些,但窥一斑可见全豹,Swift 2.0努力将更快、更安全做到极致,这是开发人员的福音,让我们尽情享受这门美妙的语言吧。【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条热点热点热点热点
24H热文一周话题本月最赞
讲师:16173人学习过
讲师:15446人学习过
讲师:14684人学习过
精选博文论坛热帖下载排行
本书对第1版的某些章节作了合理的调整,增加了部分实用的程序,并在每一章的最后加了适量的练习题,以巩固前面所学的知识,更加有利于等级考试...
订阅51CTO邮刊

我要回帖

更多关于 群星种族特性代码 的文章

 

随机推荐