MST
星途 面试题库

面试题:Visual Basic 数据注解与特性验证在复杂业务场景下的应用

在一个电商系统中,订单数据包含商品列表,每个商品有库存数量、价格等信息。订单提交时,需要验证商品库存是否足够,总金额是否与商品价格和数量计算结果相符。请基于 Visual Basic 的数据注解与特性验证机制,设计一个验证框架来处理这种复杂业务场景,描述整体设计思路并给出关键代码框架。
50.4万 热度难度
编程语言Visual Basic

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义数据模型:创建订单和商品的数据模型类,使用数据注解来标记需要验证的属性。
  2. 验证器设计:构建一个通用的验证器,利用反射来读取数据注解,并根据注解的规则进行验证。
  3. 业务逻辑整合:在订单提交的逻辑中调用验证器,确保订单数据的准确性。

关键代码框架

  1. 定义商品类
Public Class Product
    <Required>
    Public Property Stock As Integer
    <Required>
    <Range(0, Double.MaxValue)>
    Public Property Price As Double
End Class
  1. 定义订单类
Public Class Order
    <Required>
    Public Property Products As List(Of Product)
    <Required>
    Public Property TotalAmount As Double
End Class
  1. 数据注解定义
Imports System.ComponentModel.DataAnnotations

<AttributeUsage(AttributeTargets.Property, AllowMultiple := False)>
Public Class RequiredAttribute
    Inherits ValidationAttribute
    Public Overrides Function IsValid(ByVal value As Object) As Boolean
        Return value IsNot Nothing
    End Function
End Class

<AttributeUsage(AttributeTargets.Property, AllowMultiple := False)>
Public Class RangeAttribute
    Inherits ValidationAttribute
    Private _min As Double
    Private _max As Double
    Public Sub New(ByVal min As Double, ByVal max As Double)
        _min = min
        _max = max
    End Sub
    Public Overrides Function IsValid(ByVal value As Object) As Boolean
        If value Is Nothing Then Return False
        Dim num As Double
        If Double.TryParse(value.ToString(), num) Then
            Return num >= _min AndAlso num <= _max
        End If
        Return False
    End Function
End Class
  1. 验证器
Imports System.Reflection

Public Class OrderValidator
    Public Shared Function ValidateOrder(ByVal order As Order) As Boolean
        Dim isValid As Boolean = True
        '验证订单属性
        Dim orderProps = GetType(Order).GetProperties()
        For Each prop In orderProps
            Dim attrs = prop.GetCustomAttributes(GetType(ValidationAttribute), True)
            For Each attr In attrs
                Dim value = prop.GetValue(order)
                If Not CType(attr, ValidationAttribute).IsValid(value) Then
                    isValid = False
                    Exit For
                End If
            Next
            If Not isValid Then Exit For
        Next
        If isValid Then
            '验证商品列表
            Dim total As Double = 0
            For Each product In order.Products
                Dim productProps = GetType(Product).GetProperties()
                For Each prop In productProps
                    Dim attrs = prop.GetCustomAttributes(GetType(ValidationAttribute), True)
                    For Each attr In attrs
                        Dim value = prop.GetValue(product)
                        If Not CType(attr, ValidationAttribute).IsValid(value) Then
                            isValid = False
                            Exit For
                        End If
                    Next
                    If Not isValid Then Exit For
                Next
                If isValid Then
                    total += product.Price * product.Stock
                End If
                If Not isValid Then Exit For
            Next
            If isValid Then
                isValid = total = order.TotalAmount
            End If
        End If
        Return isValid
    End Function
End Class
  1. 订单提交逻辑
Public Class OrderService
    Public Sub SubmitOrder(ByVal order As Order)
        If OrderValidator.ValidateOrder(order) Then
            '执行订单提交的业务逻辑
            Console.WriteLine("订单提交成功")
        Else
            Console.WriteLine("订单数据验证失败")
        End If
    End Sub
End Class