Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >编写前置和后置条件的连贯接口库:CuttingEdge.Conditions

编写前置和后置条件的连贯接口库:CuttingEdge.Conditions

作者头像
张善友
发布于 2018-01-19 08:08:36
发布于 2018-01-19 08:08:36
5880
举报
文章被收录于专栏:张善友的专栏张善友的专栏

当调用一个方法时,在其执行之前期望其处于特定状态; 也需要完成一些工作之后验证结果的状态。 这些假设被称为前置条件(pre-conditions )和 后置条件(post-conditions)。开源项目CuttingEdge.Conditions   是一个提供一个 fluent 接口用于指定预生成和 post-conditions的库 。 (fluent 接口是通过使用的描述性的名称和方法链的可读性会最大化一个 API 设计样式)。下面是一个用CuttingEdge.Conditions的例子:

代码语言:js
AI代码解释
复制
public ICollection GetData(Nullable<int> id, string xml, ICollection col)   
{    
    // Check all preconditions:    
    Condition.Requires(id, "id")    
        .IsNotNull()          // throws ArgumentNullException on failure    
        .IsInRange(1, 999)    // ArgumentOutOfRangeException on failure    
        .IsNotEqualTo(128);   // throws ArgumentException on failure    
    Condition.Requires(xml, "xml")    
        .StartsWith("<data>") // throws ArgumentException on failure    
        .EndsWith("</data>"); // throws ArgumentException on failure    
    Condition.Requires(col, "col")    
        .IsNotNull()          // throws ArgumentNullException on failure    
        .IsEmpty();           // throws ArgumentException on failure    
    // Do some work 
    // Example: Call a method that should not return null   
    object result = BuildResults(xml, col);    
    // Check all postconditions:    
    Condition.Ensures(result, "result")    
        .IsOfType(typeof(ICollection)); // throws PostconditionException on failure    
    return (ICollection)result;    
}
代码语言:js
AI代码解释
复制
 
public static int[] Multiply(int[] left, int[] right)    
{    
    Condition.Requires(left, "left").IsNotNull();    
    // You can add an optional description to each check    
    Condition.Requires(right, "right")    
        .IsNotNull()    
        .HasLength(left.Length, "left and right should have the same length");    
    // Do multiplication    
}

每个验证程序的方法调用 — IsNotNull,IsNotEmpty等 ,如果不符合该条件将引发异常。 例如空路径是否 IsNotNull 方法调用将引发一个 ArgumentNullException。  然后,可以选择提供一个字符串,用作异常消息。

不过无法在使用验证程序类中使用,这时有两种方法来做:可以验证程序类上创建扩展方法,也可以使用哪些可用于指定布尔值或 lambda 表达式计算的评估方法。 如果该表达式返回 true,处理继续 ; 如果返回 false,则引发异常。

具体的使用方法参考作者的blog:.NET Junkie's blog - Introducing CuttingEdge.Conditions 和codepoject的文章http://www.codeproject.com/KB/library/conditions.aspx

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2009-12-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C# 中参数验证方式的演变
一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限制,如果是整数可能需要判断范围,如果是一些特殊的类型比如电话号码,邮件地址等,可能需要使用正则表达式进行判断。
跟着阿笨一起玩NET
2018/09/19
1.7K0
C# 中参数验证方式的演变
JustMock .NET单元测试利器(三)用JustMock测试你的应用程序
用JustMock测试你的应用程序 本主题将指导您通过几个简单的步骤来使用Telerik®JustMock轻松测试您的应用程序。您将理解一个简单的原理,称为Arrange / Act / Assert,并熟悉框架中的核心方法和属性,这些方法和属性在最常见的测试场景中使用 为了说明下一个例子中JustMock的用法,我们将使用一个样本仓库(warehouse)和一个依赖订单对象(Order)。仓库持有不同产品的库存。订单包含产品和数量。 仓库界面和订单类看起来像这样: publicdelegatevoidPr
码农阿宇
2018/04/18
1.2K0
【单元测试】--编写单元测试
这是一个简单的NUnit单元测试的示例,展示了如何创建测试项目,编写测试用例,运行测试以及查看测试结果。随着你的项目复杂性的增加,你可以编写更多的测试用例来确保你的代码按预期工作。
喵叔
2023/10/22
8240
JustMock .NET单元测试利器(二)JustMock基础
JustMock API基础 Mock是Telerik®JustMock框架中的主要类。Mock用于创建实例和静态模拟,安排和验证行为。 本文将介绍 “Mock”的基本用法: 首先我们创建一个IFoo对象 publicinterfaceIFoo { intBar{get;set;} voidToString(); } 创建实例模拟 要创建实Mock实例,您需要使用该Mock.Create方法或其通用版本Mock.Create<T>。有了这个,你创建一个虚假的对象,取代你的测试中的真实
码农阿宇
2018/04/18
1.1K0
数组未必一定需从0开始,谈一下非0开始的数组
彭泽0902
2018/01/04
1.1K0
AbstractQueuedSynchronizer 源码分析
AQS是通过CHL队列来实现锁请求阻塞列表的。可以通过acquire(int arg)来分析,当前线程竞争锁时的流程,然后再通过release(int arg)方法来分析,当前线程释放一个锁时的流程。这两个方法都是独占锁的流程。相对应的acquireShared(int arg) ,releaseShared(int arg)是共享锁的获取释放流程。 /** * Provides a framework for implementing blocking locks and related * sync
技术蓝海
2018/04/26
8370
AQS源码解析(一)
二话不说,先来一张图,说明一下AbstractQueuedSynchronizer(简称AQS或者同步器)在并发编程中的重要性。
黑洞代码
2021/01/14
5060
AQS源码解析(一)
框架设计原则和规范(三)
此文是《.NET:框架设计原则、规范》的读书笔记,本文内容较多,共分九章,将分4天进行推送,今天推送6-7章。 1. 什么是好的框架 2. 框架设计原则 3. 命名规范 4. 类型设计规范 5. 成员设计规范 6. 扩展性设计 7. 异常 8. 使用规范 9. 设计模式 1. 扩展性设计 1.1. 扩展机制 1.1.1. 非密封类 1.1.1.1. 考虑用不包含任何虚成员,或受保护的成员的非密封类来为框架提供扩展性 用户扩展简单,安全性很高 1.1.2.
韩伟
2018/03/05
1.1K0
微信扫码支付+Asp.Net MVC
这里的扫码支付指的是PC网站上面使用微信支付,也就是官方的模式二,网站是Asp.net MVC,整理如下。 一、准备工作 使用的微信API中的统一下单方法,关键的参数是‘公众账号ID(appid)’,
逸鹏
2018/04/10
3.2K0
微信扫码支付+Asp.Net MVC
.Net多线程编程—任务Task
1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的。 只读属性: 返回值 名称 说明 object AsyncState 表示在创建任务时传递给该任务的状态数据 TaskCreationOptions CreationOptions 获取用于创建此任务的 TaskCreationOptions CurrentId 当前正在执行 Task 的 ID
甜橙很酸
2018/03/08
1.7K0
jdk-ReentrantLock&AQS源码阅读
aqs是指类java.util.concurrent.locks.AbstractQueuedLongSynchronizer,是java并发编程的核心类,大数据同步器的实现都是围绕这个类进行实现的。该类主要由 Doug Lea(李二狗),实现的一套同步器框架,是一个可以依赖状态(state)的同步器实现。
逍遥壮士
2023/02/28
9340
jdk-ReentrantLock&AQS源码阅读
C# 单元测试框架 NUnit 一分钟浅谈
在软件开发过程中,单元测试是一种非常重要的质量保证手段。它可以帮助开发者验证代码的功能是否按预期工作,及时发现并修复错误。NUnit 是一个广泛使用的 .NET 单元测试框架,本文将从基础到进阶,介绍如何使用 NUnit 进行单元测试,并探讨一些常见的问题和易错点。
Jimaks
2024/10/30
4850
.net源码分析 – List<T>
通过分析源码可以更好理解List<T>的工作方式,帮助我们写出更稳定的代码。 List<T>源码地址: https://github.com/dotnet/corefx/blob/master/sr
用户1147588
2018/01/04
7930
.net源码分析 – List<T>
编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误、不要在不恰当的场合下引发异常、重新引发异常时使用inner Exception]
  自从.NET出现后,关于CLR异常机制的讨论就几乎从未停止过。迄今为止,CLR异常机制让人关注最多的一点就是“效率”问题。其实,这里存在认识上的误区,因为正常控制流程下的代码运行并不会出现问题,只有引发异常时才会带来效率问题。基于这一点,很多开发者已经达成共识:不应将异常机制用于正常控制流中。达成的另一个共识是:CLR异常机制带来的“效率”问题不足以“抵消”它带来的巨大收益。CLR异常机制至少有一下几个优点:
aehyok
2018/08/31
1.4K0
解析Exception和C#处理Exception的常用方法总结
该文介绍了如何在C#中实现异常处理,包括定义异常类型、抛出异常、异常处理和日志记录等方面的内容。
彭泽0902
2018/01/04
2.6K0
走进Java接口测试之流式断言库AssertJ
在设计自动化接口 Cases 时,遵守的核心原则是3A(Arrange-> Actor ->Assert)原则;
玖柒的小窝
2021/09/19
1.4K0
走进Java接口测试之流式断言库AssertJ
通用.NET数据库访问类SqlHelper
通用.NET数据库访问类SqlHelper using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collections; using System.Configuration; /*解释: * --------连接字符串属性-------- * "Server"或"Data Source"属性:服务器名 * "Database"或"Initial Catalog"属性
摘繁华
2021/12/27
3.4K0
Spring通过XML配置文件以及通过注解形式来AOP 来实现前置,后置,环绕,异常通知
AOP是Aspect Oriented Programming的缩写,意思是面向方面编程,AOP实际是GoF设计模式的延续
yaphetsfang
2020/07/30
1.3K0
ASP.NET MVC Preview生命周期分析
做ASP.NET WebForm开发都知道,ASP.NET有复杂的生命周期,学习ASP.NET MVC就要深入理解它的生命周期。今天从CodePlex上下载了ASP.NET Preview 2 的源代码,还有两个程序集Routing与Abstractions并未发布,不过这两个程序集的类并不多,可以用NET反编译工具 Reflector解开来看看,可惜这两个程序集用的是VS2008使用.net 3.5开发的,用了c# 3.0的很多特性,Reflector反编译不完全。 ASP.NET MVC通过HttpMo
张善友
2018/01/30
1.6K0
走进Java接口测试之流式断言库AssertJ
在设计自动化接口 Cases 时,遵守的核心原则是3A(Arrange-> Actor ->Assert)原则;
高楼Zee
2019/07/17
4.1K0
走进Java接口测试之流式断言库AssertJ
推荐阅读
相关推荐
C# 中参数验证方式的演变
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档