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

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

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;    
}
 
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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏芋道源码1024

哪个更快:Java 堆还是本地内存

使用Java的一个好处就是你可以不用亲自来管理内存的分配和释放。当你用new关键字来实例化一个对象时,它所需的内存会自动的在Java堆中分配。堆会被垃圾回收器进...

1184
来自专栏GreenLeaves

C# 文件读写系列二

读取文件原则上非常简单,但它不是通过FileInfo和DirectoryInfo来完成的,关于FileInfo和DirectoryInfo请参考C# 文件操作系...

3389
来自专栏张善友的专栏

在Linux和Windows平台上操作MemoryMappedFile(简称MMF)

操作系统很早就开始使用内存映射文件(Memory Mapped File)来作为进程间的共享存储区,这是一种非常高效的进程通讯手段。.NET 4.0新增加了一个...

2186
来自专栏开发 & 算法杂谈

Hiredis源码阅读(一)

Hiredis库主要包含三类API:同步api、异步api以及回复解析api。首先介绍一下同步api以及回复解析api。

56911
来自专栏向治洪

android 的android httpClient详解

AndroidHttpClient结构: public final class AndroidHttpClient extends Object imple...

2215
来自专栏跟着阿笨一起玩NET

关于DataGridView_DataError事件的问题

本文转载:http://blog.csdn.net/szstephenzhou/article/details/7834725

4301
来自专栏王磊的博客

linq to entity常用操作

一、聚合函数查询 double sum = 0; using (xxxEntities db = new xxxEntities()) { sum = ...

3746
来自专栏菩提树下的杨过

redis 学习笔记(7)-cluster 客户端(jedis)代码示例

上节学习了cluster的搭建及redis-cli终端下如何操作,但是更常用的场景是在程序代码里对cluster读写,这需要redis-client对clust...

2268
来自专栏技术博客

MVC项目开发中那些用到的知识点(Jquery ajax提交Json后台处理)

  jQuery提供的ajax方法能很方便的实现客户端与服务器的异步交互,在asp.net mvc 框架使用jQuery能很方便地异步获取提交数据,给用户提供更...

1482
来自专栏大内老A

我的WCF之旅(5):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的重载(Overloading)

对于.NET重载(Overloading)——定义不同参数列表的同名方法(顺便提一下,我们但可以在参数列表上重载方法,我们甚至可以在返回类型层面来重载我们需要的...

2796

扫码关注云+社区

领取腾讯云代金券