我经常有调用层次结构,因为所有方法都需要相同的参数。如果我不想将它们放在实例级别(类的成员),那么我总是问我在每个方法中检查它们的有效性是否有意义。
例如:
public void MethodA(object o){
if(null == o){
throw new ArgumentNullException("o");
}
// Do some thing unrelated to o
MethodB(o);
// Do some thing unrelated to o
}
public void MethodB(object o){
if(null == o){
throw new ArgumentNullException("o");
}
// Do something with o
}
如果
Method
A使用了该参数,则将其清除,我必须在其中以及在MethdoB中检查有效性。但是,只要MethodA对o
所做的仅是将其提供给MethodB
,是否在MethodA
中检查有效性也是一种好习惯。也可以在
MethodA
中进行检查的优点可能是,被调用者调用的方法中抛出了异常,这很好,但是是否有必要?调用堆栈也会说明这一点。也许它在公共(public),内部, protected 情况下有意义,但在私有(private)方法中却没有?我以null-check为例,但索引验证或范围验证也属于自我问题,但是由于冗余代码的危险,我认为存在局限性。你怎么看?
更新
通过AakashM的答案,我发现我不够精确。
MethodA
不仅调用MethodB
,它还进行其他操作,但与o
不相关。我添加了一个示例来澄清这一点。谢谢AakashM。 最佳答案
史蒂夫·麦康奈尔(Steve McConnell)的《代码完成》(Code Complete)讨论了“街垒”的概念-防御之墙,外部的数据不受信任,内部的数据受到信任。想要进入路障的数据必须经过验证过程,但是在路障中,数据可以自由移动,而无需验证代码。
如果您可以在项目中强加这么多的结构和层次结构并坚持下去,它的确会使路障代码更少的仪式和更多的本质。但是,只需一种方法就可以解决所有问题。
在您的示例中,MethodB
是public
。这意味着您将来不会自动保证MethodA
将是它的唯一调用者-因此,我想说,它的验证码应该保留。但是,如果它是该类的private
,则可以为删除它提供一个参数。
至于MethodA
,如果实际上只不过是调用MethodB
而已,则它不应该存在。如果它是将来扩展的 stub ,并且在某个时候它将对o
做一些事情,那么它的验证代码也应该保留。
关于c# - 在功能中重复参数检查,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3245258/