偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

消滅代碼中的 if :請求參數(shù)校驗(yàn)的優(yōu)雅之道

開發(fā)
傳統(tǒng)的參數(shù)校驗(yàn)方法往往充斥著大量的if語句,如何干掉這些煩人的if語句,讓參數(shù)校驗(yàn)變得更加優(yōu)雅呢?下面,我們將通過C#的例子來探討這個問題。

在軟件開發(fā)中,參數(shù)校驗(yàn)是一個非常重要的環(huán)節(jié)。它不僅能確保數(shù)據(jù)的完整性和準(zhǔn)確性,還能在一定程度上防止?jié)撛诘陌踩L(fēng)險(xiǎn)。然而,傳統(tǒng)的參數(shù)校驗(yàn)方法往往充斥著大量的if語句,這不僅讓代碼變得冗長且難以維護(hù),還降低了代碼的可讀性和優(yōu)雅性。

那么,如何干掉這些煩人的if語句,讓參數(shù)校驗(yàn)變得更加優(yōu)雅呢?下面,我們將通過C#的例子來探討這個問題。

使用特性(Attributes)進(jìn)行校驗(yàn)

C# 提供了豐富的特性(Attributes)機(jī)制,我們可以利用這一機(jī)制來進(jìn)行參數(shù)校驗(yàn)。通過定義自定義的特性,并將這些特性應(yīng)用于方法的參數(shù)上,我們可以在運(yùn)行時自動進(jìn)行參數(shù)校驗(yàn),從而避免了大量的if語句。

下面是一個簡單的例子,展示如何使用自定義特性進(jìn)行參數(shù)校驗(yàn):

using System;
using System.Reflection;

// 定義一個自定義的校驗(yàn)特性
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
public class NotNullAttribute : Attribute
{
    // 可以在這里添加一些自定義的邏輯
}

public class Validator
{
    public static void ValidateParameters(MethodInfo method, object[] parameters)
    {
        ParameterInfo[] paramInfos = method.GetParameters();
        for (int i = 0; i < paramInfos.Length; i++)
        {
            object param = parameters[i];
            NotNullAttribute attr = paramInfos[i].GetCustomAttribute<NotNullAttribute>();
            if (attr != null && param == null)
            {
                throw new ArgumentNullException(paramInfos[i].Name);
            }
            // 可以根據(jù)需要添加更多的校驗(yàn)邏輯
        }
    }
}

public class ExampleService
{
    public void ExampleMethod([NotNull] string param1, int param2)
    {
        // 方法體
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        ExampleService service = new ExampleService();
        MethodInfo method = typeof(ExampleService).GetMethod("ExampleMethod");
        object[] parameters = new object[] { null, 123 }; // 這里故意傳入一個null值以觸發(fā)校驗(yàn)失敗
        Validator.ValidateParameters(method, parameters); // 這行會拋出ArgumentNullException異常,因?yàn)閜aram1為null且被標(biāo)記為[NotNull]
        // 如果校驗(yàn)通過,則繼續(xù)執(zhí)行方法體
        // method.Invoke(service, parameters); // 實(shí)際使用時,在校驗(yàn)通過后再調(diào)用方法
    }
}

在這個例子中,我們定義了一個NotNullAttribute特性,并將其應(yīng)用于ExampleMethod方法的param1參數(shù)上。然后,我們創(chuàng)建了一個Validator類,該類具有一個靜態(tài)方法ValidateParameters,該方法接受一個MethodInfo對象和一個參數(shù)數(shù)組,并對參數(shù)進(jìn)行校驗(yàn)。如果某個參數(shù)被標(biāo)記為NotNull但值為null,則該方法會拋出一個ArgumentNullException異常。

使用FluentValidation庫

除了使用自定義特性外,我們還可以利用現(xiàn)有的校驗(yàn)庫來簡化參數(shù)校驗(yàn)。FluentValidation是一個流行的.NET校驗(yàn)庫,它提供了豐富的校驗(yàn)規(guī)則和友好的API。

下面是一個使用FluentValidation進(jìn)行參數(shù)校驗(yàn)的例子:

首先,安裝FluentValidation NuGet包:

Install-Package FluentValidation

然后,創(chuàng)建一個校驗(yàn)器類:

using FluentValidation;

public class ExampleValidator : AbstractValidator<ExampleRequest>
{
    public ExampleValidator()
    {
        RuleFor(x => x.Param1).NotNull().WithMessage("Param1 cannot be null");
        RuleFor(x => x.Param2).GreaterThan(0).WithMessage("Param2 must be greater than 0");
        // 可以根據(jù)需要添加更多的校驗(yàn)規(guī)則
    }
}

public class ExampleRequest
{
    public string Param1 { get; set; }
    public int Param2 { get; set; }
}

在業(yè)務(wù)邏輯中使用校驗(yàn)器:

public class ExampleService
{
    private readonly ExampleValidator _validator;
    
    public ExampleService()
    {
        _validator = new ExampleValidator();
    }
    
    public void ExampleMethod(ExampleRequest request)
    {
        ValidationResult result = _validator.Validate(request);
        if (!result.IsValid)
        {
            throw new ValidationException(result.Errors); // 這里可以自定義異常處理邏輯
        }
        // 如果校驗(yàn)通過,則繼續(xù)執(zhí)行方法體
    }
}

在這個例子中,我們創(chuàng)建了一個ExampleValidator類,該類繼承了FluentValidation的AbstractValidator類,并定義了校驗(yàn)規(guī)則。然后,在ExampleService類的ExampleMethod方法中,我們使用ExampleValidator對請求參數(shù)進(jìn)行校驗(yàn)。如果校驗(yàn)失敗,我們拋出一個自定義的異常。這種方法使代碼更加清晰和易于維護(hù),同時避免了大量的if語句。

責(zé)任編輯:趙寧寧 來源: 程序員編程日記
相關(guān)推薦

2023-08-04 08:52:52

Optional消滅空指針

2018-07-23 08:19:26

編程語言Python工具

2023-11-29 07:23:04

參數(shù)springboto

2018-09-18 16:20:08

Asyncjavascript前端

2019-10-11 09:07:46

Java代碼對象

2022-05-03 10:43:43

SpringJava

2021-11-10 10:03:18

SpringBootJava代碼

2024-06-21 09:19:45

代碼接口重復(fù)請求開發(fā)

2024-12-02 00:59:30

Spring

2022-04-21 09:59:53

Nest參數(shù)校驗(yàn)

2023-03-28 08:07:12

2022-11-10 07:53:54

Spring參數(shù)校驗(yàn)

2021-08-12 10:32:50

Spring Boot參數(shù)校驗(yàn)分組校驗(yàn)

2021-08-10 15:11:27

Spring Boot參數(shù)校驗(yàn)

2024-02-07 01:47:47

atexit模塊程序

2025-02-06 08:09:20

POSTGET數(shù)據(jù)

2019-01-27 14:37:47

數(shù)據(jù)HTTP服務(wù)

2024-08-05 14:10:04

2014-02-28 13:46:35

Angular代碼

2024-06-24 14:19:48

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號