我如何向班级用户表明验证要求?

问题描述 投票:3回答:5

我正在实现一个类,该类使用非常严格定义的模式包装xml文档。我不控制架构。

类中的一个属性用于模式指示必须与某个正则表达式匹配的元素值。在属性的设置器中,如果字符串与表达式不匹配,则抛出异常。

我的问题是,我如何更好地向班级用户传达此领域的要求?有没有可以使用的属性? Xml注释(所以它显示在intellisense中)?除了抛出异常外,我还应该做其他事情吗?我还有什么其他选择?

.net visual-studio validation .net-2.0
5个回答
1
投票

XmlComments如果将它们与程序集一起提供可能会有所帮助,但是我想说,如果不满足要求,最好抛出异常,并尽可能详细地说明异常消息。如果用户调用和方法/属性依赖于属性时未满足要求,我也会抛出异常(再次有很多详细信息)。

要阻止使用该代码的人第一次犯错误,您实际上无能为力,但是,在发生错误时,应尽可能清楚地指出如何纠正它。


0
投票

您的代码文档应满足要求,或者架构的文档应说明要求。对于一个不愿意研究他们将要使用的代码的人,您将无能为力。


0
投票

感谢您的建议。

我在考虑这个问题时想到的一个主意是创建一个新的类,例如MatchedString,以强制执行约束。

它有一个需要正则表达式字符串的构造函数,构造之后,该表达式仅通过只读属性向用户公开。然后,它将具有用户可以设置的value属性,该属性将与setter中的表达式进行检查。

我的想法是,当枚举验证失败时,我还可以创建用于不同行为的选项,并让用户指定所需的选项:

  • 设置为空字符串
  • 设置为空字符串并引发异常
  • 仍然设置错误的值
  • 仍然设置错误的值,并抛出异常
  • 仅抛出异常
  • 不执行任何操作

[此外,我还以为这将使我的类用户进行一些基本测试,而不必在自己的代码中复制RegEx对象。对字符串类型进行隐式转换,对类用户应该是直观的。

对此有何想法?


0
投票

无论是否使用它,实现MatchedString类看起来都很有趣。所以这里是:

Public Class MatchedString
    Public Enum InvalidValueBehaviors
        SetToEmpty
        AllowSetToInvalidValue
        DoNothing
    End Enum

    Public Sub New(ByVal Expression As String)
        Me.expression = Expression
        exp = New Regex(Me.expression)
    End Sub

    Public Sub New(ByVal Description As String, ByVal Expression As String)
        Me.expression = Expression
        exp = New Regex(Me.expression)
        _expressiondescription = Description
    End Sub

    Public Sub New(ByVal Expression As String, ByVal ThrowOnInvalidValue As Boolean, ByVal InvalidValueBehavior As InvalidValueBehaviors)
        Me.expression = Expression
        exp = New Regex(Me.expression)
        Me.ThrowOnInvalidValue = ThrowOnInvalidValue
        Me.InvalidValueBehavior = InvalidValueBehavior
    End Sub

    Public Sub New(ByVal Description As String, ByVal Expression As String, ByVal ThrowOnInvalidValue As Boolean, ByVal InvalidValueBehavior As InvalidValueBehaviors)
        Me.expression = Expression
        exp = New Regex(Me.expression)
        _expressiondescription = Description
        Me.ThrowOnInvalidValue = ThrowOnInvalidValue
        Me.InvalidValueBehavior = InvalidValueBehavior
    End Sub

    Private exp As Regex
    Private expression As String

    Public ReadOnly Property MatchExpression() As String
        Get
            Return expression
        End Get
    End Property

    Public ReadOnly Property ExpressionDescription() As String
        Get
            Return _expressiondescription
        End Get
    End Property
    Private _expressiondescription As String

    Public Function CheckIsMatch(ByVal s As String)
        Return exp.IsMatch(s)
    End Function

    Public Property ThrowOnInvalidValue() As Boolean
        Get
            Return _thrownoninvalidvalue
        End Get
        Set(ByVal value As Boolean)
            _thrownoninvalidvalue = value
        End Set
    End Property
    Private _thrownoninvalidvalue = True

    Public Property InvalidValueBehavior() As InvalidValueBehaviors
        Get
            Return _invalidvaluebehavior
        End Get
        Set(ByVal value As InvalidValueBehaviors)
            _invalidvaluebehavior = value
        End Set
    End Property
    Private _invalidvaluebehavior As InvalidValueBehaviors = InvalidValueBehaviors.DoNothing

    Public Property Value() As String
        Get
            Return _value
        End Get
        Set(ByVal value As String)
            If value Is Nothing Then value = "" 'Never set to Nothing

            If CheckIsMatch(value) Then
                _value = value
            Else
                Select Case InvalidValueBehavior
                    Case InvalidValueBehaviors.AllowSetToInvalidValue
                        _value = value
                    Case InvalidValueBehaviors.SetToEmpty
                        _value = ""
                End Select

                If ThrowOnInvalidValue Then
                    Throw New ArgumentOutOfRangeException(String.Format("String: {0} does not match expression: {1}", value, MatchExpression))
                End If
            End If
        End Set
    End Property
    Private _value As String = ""

    Public Overrides Function ToString() As String
        Return _value
    End Function
End Class

0
投票

将其记录在XML注释中,并引发异常。使消息明确:

Element <elementname> must match /regex/
© www.soinside.com 2019 - 2024. All rights reserved.