.NET 中的 Guard 子句

作者:微信公众号:【架构师老卢】
8-24 18:55
11

概述:Guard 子句是一个简单而强大的工具,用于确保在继续执行实际业务逻辑之前提供给方法的参数有效。它们有助于防止臭名昭著的 “箭头代码” (嵌套的 if 语句),并使您的代码更简洁、更易于维护。在本文中,我们将探讨如何在 .NET 中创建自定义保护子句,以有效地处理各种常见的验证方案。什么是保护子句?Guard 子句是放置在函数开头的条件检查,用于验证输入参数。如果不满足条件,函数会提前退出,通常是通过引发异常。这种方法有助于保持代码干净并防止深度嵌套。了解术语“保护条款”:您的问题解答Q: 为什么叫 “guard” 子句?**一个:**使用术语 clause 是因为它通过确保无效数据不会通过来

Guard 子句是一个简单而强大的工具,用于确保在继续执行实际业务逻辑之前提供给方法的参数有效。它们有助于防止臭名昭著的 “箭头代码” (嵌套的 if 语句),并使您的代码更简洁、更易于维护。

在本文中,我们将探讨如何在 .NET 中创建自定义保护子句,以有效地处理各种常见的验证方案。

什么是保护子句?

Guard 子句是放置在函数开头的条件检查,用于验证输入参数。如果不满足条件,函数会提前退出,通常是通过引发异常。这种方法有助于保持代码干净并防止深度嵌套。

了解术语“保护条款”:您的问题解答

Q: 为什么叫 “guard” 子句?

**一个:**使用术语 clause 是因为它通过确保无效数据不会通过来 “保护” 方法的完整性,从而保护后面的逻辑。它只允许有效的输入继续进行,从而防止代码中进一步出现错误或意外行为。guard

问:这些条款是否可以称为 “validate” 而不是 “guard”?

**一个:**虽然你可以给他们起这样的名字,但 “guard” 一词特意传达了防止坏事及早发生的想法。 通常意味着检查正确性,但也意味着采取措施,例如在条件不满足时引发异常。这为这种保护性、防御性行为提供了一个更合适的术语。ValidateValidateguardguard

没有 guard 子句的示例

让我们考虑一个场景,我们需要创建一个需要非空名称和正 age 的类。Student

public class Student  
{  
    public string Name { get; private set; }  
    public int Age { get; private set; }  
  
    public Student(string name, int age)  
    {  
        if (string.IsNullOrWhiteSpace(name))  
        {  
            throw new ArgumentException("Name cannot be null, empty, or whitespace.", nameof(name));  
        }  
  
        if (age <= 0)  
        {  
            throw new ArgumentOutOfRangeException(nameof(age), "Age must be a positive integer.");  
        }  
  
        Name = name;  
        Age = age;  
    }  
}

虽然这种方法有效,但如果您需要在多个方法或类中添加类似的检查,它可能会变得乏味。这就是自定义保护子句发挥作用的地方。

创建自定义保护子句

为了使我们的代码更具可重用性和可维护性,我们可以创建一个具有常见验证方法的 static 类。这将允许我们用一行代码替换重复的验证逻辑。Ensure

public static class Ensure  
{  
    public static void NotNullOrWhiteSpace(string value, string parameterName)  
    {  
        if (string.IsNullOrWhiteSpace(value))  
        {  
            throw new ArgumentException($"{parameterName} cannot be null, empty, or whitespace.", parameterName);  
        }  
    }  
  
    public static void Positive(int value, string parameterName)  
    {  
        if (value <= 0)  
        {  
            throw new ArgumentOutOfRangeException(parameterName, $"{parameterName} must be a positive integer.");  
        }  
    }  
}

重构类Student

有了自定义 guard 子句,我们现在可以重构类以使用这些方法。Student

使用 Guard 子句的好处

  • **提高可读性:**方法的主要逻辑不会被验证检查所掩盖。
  • **可 重用:**通用验证逻辑是集中式的,使其更易于更新或扩展。
  • **可维护性:**可以在一个位置对验证逻辑进行更改,从而降低 bug 风险。

扩展 Guard 子句

您可以扩展该类以处理其他常见的验证方案,例如检查 null 对象、验证范围、确保集合不为空等。Ensure

下面是扩展类以验证范围的示例。Ensure

public static class Ensure  
{  
    public static void InRange(int value, int min, int max, string parameterName)  
    {  
        if (value < min || value > max)  
        {  
            throw new ArgumentOutOfRangeException(parameterName, $"{parameterName} must be between {min} and {max}.");  
        }  
    }  
}

通过将通用验证逻辑抽象为可重用的方法,您可以编写更简洁、更易于维护的代码。下次您发现自己重复编写相同的验证逻辑时,请考虑创建自定义 guard 子句来简化您的代码库。

阅读排行