gpt4 book ai didi

c# - 函数中的重复参数检查

转载 作者:太空狗 更新时间:2023-10-29 22:24:45 25 4
gpt4 key购买 nike

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

例如:

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)方法中没有意义?

我以空检查为例,但索引验证或范围验证也属于 self 问题,但我认为由于冗余代码的危险而存在局限性。你怎么看?

更新

通过 AakashM 的回答,我发现我不够精确。 MethodA 不仅会调用MethodB,它还会做一些与o 无关的事情。我添加了一个例子来澄清这一点。谢谢 AakashM。

最佳答案

Steve McConnell 的 Code Complete 谈到了“路障”的概念——一堵防御墙,外面的数据是不可信的,里面的数据是可信的.想要进入路障的数据必须经过验证过程,但在路障内,数据可以自由移动,不受验证代码的限制。

如果您可以在您的项目中强加这么多的结构化和分层,并坚持下去,它确实会让内部代码少一些仪式感,多一些本质。但只需要一个方法就可以调用路障,一切都会出错。

在您的示例中,MethodBpublic。这意味着您没有自动的 future 保证 MethodA 将是它的唯一调用者——因此我会说它的验证代码应该保留。但是,如果它对类(class)来说是私有(private)的,您可以提出将其删除的论据。

至于MethodA,如果它实际上除了调用MethodB 之外什么都不做,那么它不应该存在。如果它是 future 扩展的 stub ,并且在某个时候它要用 o 做一些事情,那么它的验证代码也应该保留。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com