当前位置:首页 > 科技  > 软件

消灭代码中的 if :请求参数校验的优雅之道

来源: 责编: 时间:2024-06-19 15:36:44 240观看
导读在软件开发中,参数校验是一个非常重要的环节。它不仅能确保数据的完整性和准确性,还能在一定程度上防止潜在的安全风险。然而,传统的参数校验方法往往充斥着大量的if语句,这不仅让代码变得冗长且难以维护,还降低了代码的可

在软件开发中,参数校验是一个非常重要的环节。它不仅能确保数据的完整性和准确性,还能在一定程度上防止潜在的安全风险。然而,传统的参数校验方法往往充斥着大量的if语句,这不仅让代码变得冗长且难以维护,还降低了代码的可读性和优雅性。Rzk28资讯网——每日最新资讯28at.com

那么,如何干掉这些烦人的if语句,让参数校验变得更加优雅呢?下面,我们将通过C#的例子来探讨这个问题。Rzk28资讯网——每日最新资讯28at.com

Rzk28资讯网——每日最新资讯28at.com

使用特性(Attributes)进行校验

C# 提供了丰富的特性(Attributes)机制,我们可以利用这一机制来进行参数校验。通过定义自定义的特性,并将这些特性应用于方法的参数上,我们可以在运行时自动进行参数校验,从而避免了大量的if语句。Rzk28资讯网——每日最新资讯28at.com

下面是一个简单的例子,展示如何使用自定义特性进行参数校验:Rzk28资讯网——每日最新资讯28at.com

using System;using System.Reflection;// 定义一个自定义的校验特性[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);            }            // 可以根据需要添加更多的校验逻辑        }    }}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值以触发校验失败        Validator.ValidateParameters(method, parameters); // 这行会抛出ArgumentNullException异常,因为param1为null且被标记为[NotNull]        // 如果校验通过,则继续执行方法体        // method.Invoke(service, parameters); // 实际使用时,在校验通过后再调用方法    }}

在这个例子中,我们定义了一个NotNullAttribute特性,并将其应用于ExampleMethod方法的param1参数上。然后,我们创建了一个Validator类,该类具有一个静态方法ValidateParameters,该方法接受一个MethodInfo对象和一个参数数组,并对参数进行校验。如果某个参数被标记为NotNull但值为null,则该方法会抛出一个ArgumentNullException异常。Rzk28资讯网——每日最新资讯28at.com

使用FluentValidation库

除了使用自定义特性外,我们还可以利用现有的校验库来简化参数校验。FluentValidation是一个流行的.NET校验库,它提供了丰富的校验规则和友好的API。Rzk28资讯网——每日最新资讯28at.com

下面是一个使用FluentValidation进行参数校验的例子:Rzk28资讯网——每日最新资讯28at.com

首先,安装FluentValidation NuGet包:Rzk28资讯网——每日最新资讯28at.com

Install-Package FluentValidation

然后,创建一个校验器类:Rzk28资讯网——每日最新资讯28at.com

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");        // 可以根据需要添加更多的校验规则    }}public class ExampleRequest{    public string Param1 { get; set; }    public int Param2 { get; set; }}

在业务逻辑中使用校验器:Rzk28资讯网——每日最新资讯28at.com

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); // 这里可以自定义异常处理逻辑        }        // 如果校验通过,则继续执行方法体    }}

在这个例子中,我们创建了一个ExampleValidator类,该类继承了FluentValidation的AbstractValidator类,并定义了校验规则。然后,在ExampleService类的ExampleMethod方法中,我们使用ExampleValidator对请求参数进行校验。如果校验失败,我们抛出一个自定义的异常。这种方法使代码更加清晰和易于维护,同时避免了大量的if语句。Rzk28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-94850-0.html消灭代码中的 if :请求参数校验的优雅之道

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Go必知必会:并发编程的核心channel

下一篇: 赶紧试试 Python 3.12 吧,真的好用

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • Raft算法:保障分布式系统共识的稳健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库:让你的应用更亲民友好,实现视频通话无痛接入! 除了基本用法外,还有一些进阶用法可以更好地利用该库。自定义 STUN/TURN 服务器配置WebRTC.Net 默认使用 Google 的
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • iQOO Neo8 Pro抢先上架:首发天玑9200+ 安卓性能之王

    经过了一段时间的密集爆料,昨日iQOO官方如期对外宣布:将于5月23日推出全新的iQOO Neo8系列新品,官方称这是一款拥有旗舰级性能调校的作品。随着发布时
  • 回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
Top