我经常有调用层次结构,因为所有方法都需要相同的参数。如果我不想将它们放在实例级别(类的成员),那么我总是问我在每个方法中检查它们的有效性是否有意义。

例如:

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)讨论了“街垒”的概念-防御之墙,外部的数据不受信任,内部的数据受到信任。想要进入路障的数据必须经过验证过程,但是在路障中,数据可以自由移动,而无需验证代码。

如果您可以在项目中强加这么多的结构和层次结构并坚持下去,它的确会使路障代码更少的仪式和更多的本质。但是,只需一种方法就可以解决所有问题。

在您的示例中,MethodBpublic。这意味着您将来不会自动保证MethodA将是它的唯一调用者-因此,我想说,它的验证码应该保留。但是,如果它是该类的private,则可以为删除它提供一个参数。

至于MethodA,如果实际上只不过是调用MethodB而已,则它不应该存在。如果它是将来扩展的 stub ,并且在某个时候它将对o做一些事情,那么它的验证代码也应该保留。

关于c# - 在功能中重复参数检查,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3245258/

10-13 06:12