在我当前的系统中,我决定构建一些通用的扩展方法,以便以后在整个当前系统中重用。
当我使用Microsoft 代码合同时,我决定首先将它们包括在内以验证source
和range
.
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和抛出异常(如第二个示例)。
这种方式的优点是带有扩展方法的测试泛型类无需更改即可重用。但缺点是采用了另一种类型的验证。
任何关于使用哪种方法的建议/建议都将受到欢迎。
谢谢关注!