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

时间:2008-10-07 16:26:55

标签: .net visual-studio validation .net-2.0

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

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

我的问题是,我怎样才能更好地与班级用户沟通这个领域的要求?有可以使用的属性吗? Xml注释(因此它显示在intellisense中)?除了抛出异常,我应该做些什么吗?我还有其他选择吗?

5 个答案:

答案 0 :(得分:1)

如果您使用程序集发送它们,XmlComments可能会有所帮助,但我会说,如果不满足要求,最好抛出异常,并尽可能详细地说明异常消息。如果在用户调用和依赖属性的方法/属性时不满足要求,我也会抛出异常(同样有很多细节)。

没有太多可以做的事情是让第一次使用代码的人犯错误,但是当错误发生时你应该尽可能清楚地知道如何纠正错误。

答案 1 :(得分:0)

在XML注释中记录它,并抛出异常。使消息明确:

“元素< elementname>必须匹配/ regex /”;

这就是你所能做的一切。

答案 2 :(得分:0)

您的代码文档应该满足要求,或者模式的文档应该解释要求。对于那些不打算研究他们即将使用的代码的人,你不能做任何事情。

答案 3 :(得分:0)

感谢您的建议。

我在思考这个问题时想到的一个想法是创建一个名为MatchedString的新类来强制执行约束。

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

我的想法是,我还可以为枚举中验证失败时使用的不同行为创建选项,并让用户指定他们想要的内容:

  • 设置为空字符串
  • 设置为空字符串并抛出异常
  • 无论如何都设置了不好的价值
  • 无论如何都设置了不好的价值,然后抛出激励
  • 只是抛出异常
  • 什么都不做

另外,我认为这将允许我的类用户进行一些基本测试,而无需在他们自己的代码中复制RegEx对象。对字符串类型进行隐式转换,对类用户来说应该是直观的。

对此有何想法?

答案 4 :(得分: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