检查方法中的无效值
本文关键字:无效 方法 检查 | 更新日期: 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();
}
检查可以隐藏或嵌套且更难找到的位置。