我有一个讨论,关于代码契约的使用情况进行检查的先决条件同事。
比方说,我们有下面的代码:
namespace Project
{
using System;
using System.Diagnostics.Contracts;
public class Thing
{
public string Foo { get; set; }
public int Bar { get; set; }
}
public class ThingsManipulator
{
public void AddThing(Thing thing)
{
Contract.Requires<ArgumentNullException>(thing != null);
// Do something
}
}
}
如果// Do something
,我访问thing.Foo
和thing.Bar
做的事情,我应该验证他们也通过代码契约?
public void AddThing(Thing thing)
{
Contract.Requires<ArgumentNullException>(thing != null);
Contract.Requires<ArgumentException>(!string.IsNullOrWhiteSpace(thing.Foo));
Contract.Requires<ArgumentException>(thing.Bar > 0);
// Do something
}
我的同事说,只有参数作为一个整体,应检查(即我们应该只把第一份合同),我觉得方法应该检查他们使用什么不论它是整个参数或它的一个属性(即我们应该所有三个合同)。
请注意,我明白和同意这一点。如果一个参数的属性应始终满足一个要求,这个要求应该被放置在该对象的不变的检查。
什么我指的是价值观,其一般是有效的,但不是有效的特定方法(例如,在上面的例子中thing.Bar
可以高高兴兴地抱负值,但AddThing
不喜欢它们)。
我的同事在这些情况下说的方法签名应该明确所有项目它的使用,而不是一个单一的对象(如AddThing(string thingFoo, int thingBar)
并在其上运行的检查。
所以:
- 我们应该验证什么方法使用或只有参数作为一个整体,“爆炸”的参数?
- 是否有一个技术理由这样做(无论什么“吧”的意思)或者是偏好的问题?
我一直没能找到这个准则的手册 ,也许我错过了什么?