根据以下方案/代码,在哪里进行验证的正确位置:
仅在MethodA中:因为这是外部程序集要使用的公共方法? 在MethodA和B中,因为这两个都可以在课外访问吗? 或方法A,B和C,因为方法C可能被另一个内部方法使用(但它可能效率不高,因为程序员已经可以看到MethodC的代码,因此应该能够知道要传递的有效参数)?
感谢您的任何意见。
public class A
{
public void MethodA(param)
{
MethodB(param);
}
internal void MethodB(param)
{
MethodC(param);
}
private void MethodC(param)
{
}
}
答案 0 :(得分:2)
无论调用者的位置如何(组件内部或外部),都应始终执行参数验证。可以说是防御性编程。
答案 1 :(得分:1)
MethodC;这样,即使有人稍后出现并且在A类中添加对MethodC的调用,或者他们将MethodC公开,也始终检查参数。任何例外都应该被鼓泡到可以最好处理的地方。
答案 2 :(得分:0)
除了遵守DRY原则并避免将验证码复制到多个地方外,没有“正确”的地方。我通常建议您将验证延迟到最新的可能阶段,因为如果参数从未使用过,您不需要花时间验证它。这也验证了它所使用的地方的某些位置,你永远不需要想'哦,这个参数已经过验证了吗?'因为验证就在那里。
答案 3 :(得分:0)
鉴于更有可能的Senario将涉及每个方法具有不同的参数,也可能涉及一些
if (P1 == 1) { MethodA(P2) } else { MethodB(P2) }
在较长期内输入类型逻辑在入口点验证每个参数更有意义,特别是因为您可能需要根据调用方法的位置进行不同的错误处理。
如果给定参数的验证逻辑开始变得复杂(即超过五行代码),那么请考虑使用私有方法来验证该参数。