检查方法中的无效值

本文关键字:无效 方法 检查 | 更新日期: 2023-09-27 18:28:42

我正在尝试找到正确的方法来编写有关检查无效值的代码。在我的情况下,无效值将是null.SO中其他问题的问题在于它们属于特定情况,我对更通用的解决方案感兴趣。

我有这样的代码:

public class SomeClass
{
    private readonly object m_internallyUsedObject;
    private ThirdPartyObject m_user; // Third party object.
    public SomeClass(object internallyUsedObject)
    {
        m_internallyUsedObject = internallyUsedObject; // We just want to ensure that the object will remain the same throught the life time of SomeClass object.
        m_user = new ThirdPartyObject(); // This object is not yet needed here.
    }
    public void DoSomething()
    {
        m_user.DoSomethingElse(m_internallyUsedObject); // Now we're using it and we are not sure whether null value is tolerated.
    }
}

由于我们在构造函数中采用internallyUsedObject,因此我们可能知道此对象的语义以及应该如何使用它。另一方面,我们只是在调用期间将此对象中继到第三方对象。无论值是否null,我们的SomeClass对象都可以正常工作。

现在,问题是我们不知道null是否总是适用于ThirdPartyObject - 它可能在一个版本中有效(在这种情况下,可以省略null检查(而在另一个版本中不起作用。

可以说,如果我们的类可以处理它,我们不应该关心检查null。但是当我编写代码文档时,我想告诉用户我们自己类的行为和期望。

正如我上面提到的,这个简单的检查在特定第三方对象的版本中可能没有用,甚至无效:

if (internallyUsedObject == null)
{
    throw new ArgumentNullException("internallyUsedObject");
}

当我们不打算直接使用它时,根据 OOP 从构造函数中的上述代码中获取internallyUsedObject是否有效?它是否违反了"快速失败"原则,因为看起来我们只是将问题推迟到对象生命周期的后期阶段?

检查方法中的无效值

作为一项规则,我倾向于使用您在第二个代码块中描述的方法,但与合理的检查分组相结合。我的意思是,在执行逻辑之前,应该对特定方法执行某些检查并执行操作,例如

public void MyMethod(MyObject input) {
    // 1. perhaps security checks, if an in method security is required
    if(security.AccessLevel < requiredLevel)
        throw new CustomSecurityException("Insufficent Access");
    // 2. data checks
    if(input.Property == null)
        throw new ArgumentNullException("Input didn't contain the value I wanted");
    if(input.Property2 < someImportantLevel)
        throw new CustomBLException("Input didn't meet required level for something");
    // 3. perform BL
    // ...do whatever
}

这可能并不理想,通常诸如方法属性之类的东西可以用于安全方面,但是在我们的很多应用程序中,这似乎是一组明智的检查。您知道所有检查都是预先完成的,而不是像这样冗长的块:

if(input != null) {
    //do logic
} else {
    throw new Exception();
}

检查可以隐藏或嵌套且更难找到的位置。