3

在我当前的系统中,我决定构建一些通用的扩展方法,以便以后在整个当前系统中重用。

当我使用Microsoft 代码合同时,我决定首先将它们包括在内以验证sourcerange.

1)

public static class MyExtensions {
    public static void RemoveRange<T>(this ObservableCollection<T> source, IEnumerable<T> range) where T : class {
        Contract.Requires(source != null);
        Contract.Requires(range != null);

        foreach (var element in range) {
            source.Remove(element);
        }
    }       
}

另一种实现方式是经典的方式:

2)

public static class MyExtensions {
    public static void RemoveRange<T>(this ObservableCollection<T> source, IEnumerable<T> range) where T : class {
        if (source == null) {
            throw new ArgumentNullException("source");
        }

        foreach (var element in range) {
            source.Remove(element);
        }
    }   
}

直到此刻,我还没有这样的要求来设计可以在另一个系统中重用的泛型类

编辑(开始) (通过另一个系统,我的意思是具体不同的系统,具有不同的架构。例如:当前系统如果用于金融部门,它使用代码合同。但其他系统可以用于军事部门,不会使用代码合同验证。) 编辑(结束)

我与我的同事讨论了该通用类在另一个系统中的扩展方法的可重用性如何?

I)一个意见是保留代码合同,因为这是整个当前系统中的验证规则。(如第一个例子)。

这种方式的优点是我在整个系统中保留了一种验证方式(仅通过代码合同)。缺点是这个Tested Generic Class with Extension 方法将不能在另一个系统中重用(可能不会使用 Code Contracts 进行验证)而不用 classic 替换 Contracts If/Throw Exception

II)另一种意见是设计带有扩展方法的通用类,以便在另一个系统中可重用,即使我们直到现在还没有这样的要求。这种观点需要一个经典的验证实现,通过IF抛出异常(如第二个示例)。

这种方式的优点是带有扩展方法的测试泛型类无需更改即可重用。但缺点是采用了另一种类型的验证。

任何关于使用哪种方法的建议/建议都将受到欢迎。

谢谢关注!

4

1 回答 1

1

您可以将代码协定添加到类库,而无需为使用该类库的任何其他程序集引入对代码协定的依赖。

代码契约由修改指定代码契约的代码的重写器实现。其余的代码契约支持已经融入 .Net 4 或更高版本,因此其他代码可以愉快地引用使用代码契约的库,而无需采取任何特殊步骤。

因此,您可以在某些程序集中使用代码协定,而不必担心引用这些程序集的任何其他内容。

具体来说,这种说法是不正确的:

缺点是,如果不使用经典的 If/Throw Exception 替换 Contracts,则此 Tested Generic Class with Extension 方法将无法在另一个系统中重用(可能不会使用 Code Contracts 进行验证)。

因为您可以在“其他系统”中重用它(如果“其他系统”是指“不使用代码合同的程序集”)。

于 2013-06-26T08:20:12.720 回答