字据一种很好的旧软件征战作念法,应在每个方法的顶部(即收场任何热切活动之前)舍弃一个条目语句手脚樊篱。 每个条目语句皆查验输入值必须考证的不同条目。 若是条目未通过考证制作app软件价格,代码会激勉非常。 这种模式经常称为 If-Then-Throw。
然则,有了 If-Then-Throw,咱们就不错编写出高效正确的代码吗? 是不是在扫数情况下,这皆满盈了?
If-Then-Throw 不是在扫数情况下皆能治理扫数问题,这不是什么新不雅点。 字据商定缱绻 (DbC) 是 Bertrand Meyer 几年前提议的方法,这种方法基于这么一种念念法,即每个软件皆领有一个认真刻画其输入和输出的商定。 If-Then-Throw 模式确凿涵盖了商定的第一部分,但它透澈不涉考中二部分。 任何主流编程言语皆不是自然支柱 DbC 的。 不外,通过现存的一些框架,您不错尝试在常用言语(如 Java、Perl、Ruby、JavaScript 言语,诚然还有 Microsoft .NET Framework 言语)中选拔 DbC 方法。 在 .NET 中,不错通过 .NET Framework 4 中增多的代码商定库收场 DbC,该代码商定库位于 mscorlib 圭臬聚积。 请细心,该库可用于 Silverlight 4 诈欺圭臬,不成用于 Windows Phone 诈欺圭臬。
我信托确凿每个征战东谈主员皆原则上喜悦,商定优先征战方法是一种极好的征战方法。 不外我以为,在 .NET 4 诈欺圭臬中积极使用代码商定的东谈主并未几,因为 Microsoft 已提供了软件商定并将其集成在 Visual Studio 中。本文堤防先容商定优先方法在代码调养和简化征战方面的上风。 在征战下一个状貌时,您不错模仿本文不雅点向指点保举代码商定。 以后,我将在本专栏中对某些方面长远探讨,如树立、运行时器具和编程功能(如接受)。
联系浅陋 Calculator 类的推论代码商定关乎心态;您不应比及必须缱绻需要超等体捆绑构并选拔好多前沿本事的大型诈欺圭臬时才念念起使用代码商定。 请细心,若是经管不善,再浩大的本事也可能带来问题。 只消熟识掌捏代码商定,代码商定就适用于确凿任何类型的诈欺圭臬。 上海网站建筑 咱们从一个浅陋的类着手,一个经典的 Calculator 类,如下所示:
您可能会喜悦,此处不是本色的代码,因为它至少穷困一个热切的部分:查验是否要尝试扩张除数为零的运算。 咱们要完善代码,因此,咱们还假设还有一个问题要处理:该计较器不支柱负值。 图 1 是该代码的更新版块,其中添加了一些 If-Then-Throw 语句。
图 1 收场 If-Then-Throw 模式的 Calculator 类
到现时,不错这么说,咱们的类或者着手处理其输入数据,或者(若是输入无效)在扩张任何运算之前激勉非常。 该类生成的服从怎样? 咱们了解它们的哪些情况? 字据要领,这两个方法皆应复返不小于零的值。 咱们怎样强制收场这极少并在它未发生时失败? 咱们需要该代码的第三个版块,如图 2 所示。
图 2 查验前置条目和后置条目的 Calculator 类
两个方法现时皆包含三个不同阶段:查验输入值、扩张运算和查验输出。 对输入和输出的查验区分有不同的指标。 输入查验可绚丽调用方代码中的 Bug。 输出查验可发现您我方的代码中的 Bug。 您是否确实需要对输出进行查验? 诚然,通过某些单位测试中的声明不错考证查验条目。 在这种情况下,您不一定需要在运行期间码中包含这种查验。 然则,代码中的查验可使类具有自我刻画性,不错明晰地标明它不错和不不错扩张的操作,这与商定奇迹的条目十分同样。
若是将图 2 中的源代码与咱们着手时先容的浅陋类进行比拟,就会看到源代码增多了好多行,这是一个只需要称心很少要求的浅陋类。 让咱们再进一步。
在图 2 中,咱们细则的三个圭臬(查验输入、运算和查验输出)是规矩扩张的。 若是运算的扩张十分复杂,需要加入其他退出点,该奈何处理? 若是某些退出点援用会产生其他服从的乖张条目,该奈何处理? 事情确乎可能会很复杂。 但为了进行证实,向其中一个方法添加一个快捷退出就满盈了,如图 3 所示。
图 3 快捷退出复制后置条目代码
在示例代码中(这仅仅 一个示例),若是两个值卓越(相乘而不是相加),则方法 Sum 尝试一种快捷方式。 然则,必须针对代码中的每个提前退出息径复制输出值查验代码。
要害是莫得东谈主不错合理地设念念选拔一种商定优先的软件征战方法而不使用一些热切器具,至少是使用特定的匡助圭臬框架。 查验初步条目相对容易且资本较低;若是手动处理扩张后的条目,扫数这个词基本代码会难以处理,况兼容易出错。 更无用说,对于征战东谈主员而言,商定的其他一些附庸方面会使类的源代码一派衰退,举例,在输入参数是集会时查验条目,以及确保每当调用方法或属性时类老是处于已知有用景况。
输入代码商定在 .NET Framework 4 中,代码商定是一个框架,它提供了愈加便捷的语法来抒发类商定。 具体而言,代码商定支柱三种商定:前置条目、后置条目和固定条目。 前置条目指为了安全扩张方法而应该考证的初步条目。 后置条目指方法正确扩张或激勉非常后应该考证的条目。 终末,固定条目指在职何类实例的生涯期内永恒为确实条目。 更准确地说,固定条目是在类与客户端之间的每个可能交互之后(即在扩张包括构造函数在内的大家成员之后)皆必须保持的条目。 固定条目是不会查验的,制作app开发多少钱因此,在调用专有成员之后,可能暂时违背这种条目。
代码商定 API 由一组在类商定上界说的静态方法构成。 您不错使用 Requires 方法暗示前置条目,使用 Ensures 方法暗示后置条目。 图 4 证实怎样使用代码商定再行编写 Calculator 类。
图 4 使用代码商定再行编写的 Calculator 类
大概比拟一下图 3 和图 4,不错看出 API 收场 DbC 的有用性。 方法代码再行回到一种高度可读的花式,在其中唯有两个头绪:商定信息(同期包括前置条目和后置条目)和本色活动。 您不必像图 3 中那样,将条目和活动混在沿途。 因此,可读性大大普及,对于团队来说,代码调养容易多了。 举例,您不错字据需要,快速安全地添加新的前置条目或裁剪后置条目,您只需在一个位置进行转换,还不错明晰地对更纠正行追踪。
商定信息不错通过正常 C# 或 Visual Basic 代码暗示。 商定证实不同于经典的声明性属性,但它们保留了很强的声明性作风。 使用纯代码而不使用属性可普及征战东谈主员的编程能力,因为在这种方式下,不错更当然地抒发心中所念念的条目。 同期,在重构代码时,代码商定更具率领性。 本色上,代码商定会指出方法的可用活动。 代码商定有助于在编写方法时投降编码准则,有助于在前置条目和后置条目较多时保持代码的可读性。 即使不错像图 4 那样使用简略的语法抒发商定,在本色编译代码时,所取得的代码流也可能与图 3 中的代码差未几。 那么决窍在那处?
Visual Studio 生成历程中集成的另一个器具(代码商定重写圭臬)不错重塑代码,了解所抒发的前置条目和后置条目的预定用途,并将它们的逻辑置入正确的代码块中。 手脚征战东谈主员,若是您在某处裁剪代码以添加另一个退出点,则不必驰念在那处舍弃后置条目和在那处将其复制。
暗示条目您不错参考代码商定文档细则前置条目和后置条目的准确语法;不错从 DevLabs 网站 bit.ly/f4LxHi 获取最新 PDF。 我浅陋笼统一下。 您不错使用以下方法提醒所需条目,不顺应条目则激勉指定的非常:
该方法有几个可能需要研究的重载。 方法 Ensures 暗示后置条目:
app在编写前置条目时,抒发式经常仅包含输入参数,可能包含消亡个类中的某个其他方法或属性。 若是是这种情况,则需要使用 Pure 属性对该方法进行修饰,以指明扩张该方法不会改换对象的景况。 请细心,代码商定器具假设属性 getters 是纯的。
在编写后置条目时,可能需要拜谒其他信息,如局部变量的复返值或驱动值。 为此,不错使用一些特定方法,举例,使用 Contract.Result<T> 获取方法的复返值(类型为 T),使用 Contract.OldValue<T> 获取方法着手扩张时存储在指定局部变量中的值。 终末,还不错在方法扩张时辰激勉非常时对条目进行考证。 在这种情况下,不错使用方法 Contract.EnsuresOnThrow<TException>。
缩写方法商定语法信服比使用纯代码愈加紧凑,但也可能变得很大。 发生这种情况时,可读性又会受到影响。 一个当然的扶植方法是将多个商定提醒组合在一个子例程中,如图 5 所示。
龙头分析:历史同期第182期龙头分别开出号码:01→02→01,龙头开出比较密集,去年同期龙头号码下降了1个点位,对比去年龙头,今年第182期看好龙头转向上升,关注号码03。
图 5 使用 ContractAbbreviator
ContractAbbreviator 属性提醒重写圭臬怎样正确发挥带相应修饰符的方法。 本色上,若是不使用该属性将其甩手为一种可扩展的宏,ValidateResult 方法(以及图 5 中的其他 ValidateXxx 方法)可能包含相配复杂的代码。 举例,在 void 方法中使用时,Contract.Result<T> 会援用什么内容? 现时,mscorlib 圭臬集不包含 ContractAbbreviator 属性,因此,征战东谈主员必须在状貌中进行明确界说。 该类很浅陋:
纠正后的简略代码
说七说八,代码商定 API(基本上即是 Contract 类)是 .NET Framework 4 自身的一部分,因为它属于 mscorlib 圭臬集。 Visual Studio 2010 在特定于代码商定树立的状貌属性中提供了一个树立页。 对于每个状貌,您必须明确启用商定的运行时查验。 您还需要从 DevLabs 网站下载运行时器具。 在该网站上,您不错取舍适用于所用 Visual Studio 版块的装配圭臬。 运行时器具包括代码商定重写圭臬和接口生成器以及静态查验圭臬。
代码商定通过强制提醒每个方法的活动和服从,有助于编写简略的代码。 至少,它可在重构和纠正代码时提供指南。 对于代码商定制作app软件价格,还有好多内容需要接洽。 具体而言,在本文中,我仅仅浅陋提到固定条目,透澈莫得说起浩大的功能商定接受。 在以后的著作中,我准备先容这些内容以及干系内容。 请延续调养!