把柄一种很好的旧软件设备作念法,应在每个方法的顶部(即已毕任何伏击行为之前)放手一个条目语句行动樊篱。 每个条目语句齐搜检输入值必须考据的不同条目。 若是条目未通过考据,代码会激励颠倒。 这种模式频繁称为 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 暗意后置条目:
在编写前置条目时,抒发式频繁仅包含输入参数,可能包含归拢个类中的某个其他方法或属性。 若是是这种情况,则需要使用 Pure 属性对该方法进行修饰,以指明实施该方法不会转换对象的情景。 请驻扎,代码商定用具假设属性 getters 是纯的。
在编写后置条目时,可能需要走访其他信息,如局部变量的复返值或运转值。 为此,不错使用一些特定方法,举例,使用 Contract.Result<T> 获取方法的复返值(类型为 T),使用 Contract.OldValue<T> 获取方法动手实施时存储在指定局部变量中的值。 临了,还不错在方法实施时刻激励颠倒时对条目进行考据。 在这种情况下,不错使用方法 Contract.EnsuresOnThrow<TException>。
缩写方法商定语法敬佩比使用纯代码愈加紧凑,但也可能变得很大。 发生这种情况时,可读性又会受到影响。 一个当然的挽救方法是将多个商定领导组合在一个子例程中,如图 5 所示。
图 5 使用 ContractAbbreviator
范闲双色球第2024079期红球012路分析:上期红球012路比为2:1:3,2路红球较热,1路红球较冷;最近7期红球012路比为16:12:14,0路红球较热,1路红球较冷。
ContractAbbreviator 属性领导重写步伐怎么正确讲解带相应修饰符的方法。 本色上,若是不使用该属性将其胁制为一种可彭胀的宏,ValidateResult 方法(以及图 5 中的其他 ValidateXxx 方法)可能包含相配复杂的代码。 举例,在 void 方法中使用时,Contract.Result<T> 会援用什么内容? 目下,mscorlib 步伐集不包含 ContractAbbreviator 属性,因此,设备东谈主员必须在名堂中进行明确界说。 该类很大致:
改良后的任性代码
总而言之,代码商定 API(基本上便是 Contract 类)是 .NET Framework 4 本人的一部分,因为它属于 mscorlib 步伐集。 Visual Studio 2010 在特定于代码商定配置的名堂属性中提供了一个配置页。 对于每个名堂,您必须明确启用商定的运行时搜检。 您还需要从 DevLabs 网站下载运行时用具。 在该网站上,您不错选拔适用于所用 Visual Studio 版块的装配步伐。 运行时用具包括代码商定重写步伐和接口生成器以及静态搜检步伐。
代码商定通过强制领导每个方法的行为和效用,有助于编写任性的代码。 至少制作app开发多少钱,它可在重构和改良代码时提供指南。 对于代码商定,还有好多内容需要接洽。 具体而言,在本文中,我仅仅大致提到固定条目,十足莫得说起浩大的功能商定经受。 在以后的著述中,我准备先容这些内容以及联系内容。 请不息柔和!