2

使用复杂的返回类型:

Public Type TimeType
    hours As Integer
    minutes As Integer
End Type

Public Function ParseTimeField(time As String) As TimeType
    Dim timeObject As TimeType
    Dim amountOfDigitHours As Integer

    If time = "" Then time = "0"

    If HasHoursAndMinutesParts(time) Then
        amountOfDigitHours = GetAmountOfDigitHours(time)
        timeObject.hours = CInt(Left(time, amountOfDigitHours))
        timeObject.minutes = CInt(Right(time, 2))
    Else
        timeObject.hours = 0
        timeObject.minutes = CInt(time)
    End If

    ParseTimeField = timeObject
End Function

Private Function HasHoursAndMinutesParts(time As String) As Boolean
    HasHoursAndMinutesParts = Len(time) > 2
End Function

Private Function GetAmountOfDigitHours(time As String) As Integer
    GetAmountOfDigitHours = Len(time) - 2
End Function

称呼:

Dim timeObj As TimeType
timeObj = ParseTimeField(strTime)

或使用 out 参数:

Public Function ParseTimeField(time As String, ByRef hours As Integer, ByRef minutes As Integer)
    Dim timeObject As TimeType
    Dim amountOfDigitHours As Integer

    If time = "" Then time = "0"

    If HasHoursAndMinutesParts(time) Then
        amountOfDigitHours = GetAmountOfDigitHours(time)
        hours = CInt(Left(time, amountOfDigitHours))
        minutes = CInt(Right(time, 2))
    Else
        hours = 0
        minutes = CInt(time)
    End If

    ParseTimeField = timeObject
End Function

Private Function HasHoursAndMinutesParts(time As String) As Boolean
    HasHoursAndMinutesParts = Len(time) > 2
End Function

Private Function GetAmountOfDigitHours(time As String) As Integer
    GetAmountOfDigitHours = Len(time) - 2
End Function

称呼:

Dim hours As Integer
Dim minutes As Integer

Call ParseTimeField(strTime, hours, minutes)

顺便说一句,这是 VB6 代码 =)

4

4 回答 4

3

如果您只有一个返回类型,请不要使用 out 参数来返回它。

一般来说,我发现多个ref/out参数是代码异味。如果您需要从您的方法中返回数据,最好将它放在一个连贯的对象中。

于 2011-01-21T13:57:47.980 回答
2

我有一种感觉,我们将在这个问题上看到不同的意见。不确定是否存在最佳实践。

我通常更喜欢复杂的数据类型,因为我觉得它更符合函数的原始结构,其中输出参数在签名中的输入参数之前。基本上我不喜欢输出参数——它们是多余的。每当有两种方法可以在编程语言中做某事时,您就会使不必要的复杂化(我猜我会被 Perl 狂热者杀死)。您使用 return 语句返回数据。时期。

这就是说,当我需要返回两个没有自然分组的参数时,我仍然发现自己经常使用 out 参数 - 即最终会出现在一个仅用于此特定函数的返回值的类中。

每当返回数据中有三个或更多参数时,我从不使用 out 仅仅是因为我发现调用代码过于冗长 - 需要对变量进行调暗(或 C# 中的 var'em)

于 2011-01-21T14:09:09.907 回答
1

我倾向于使用 params 作为通用样式。很少需要实现返回 UDT 的辅助函数,但这些函数通常是模块私有的,因此我也可以将 UDT 的范围保持为模块私有。

在后一种情况下,通常会像这样消耗 retval

With ParseTimeField(strTime)
    Debug.Print .hours, .minutes
End With

...并且很可能会保留TimeType私有范围。

于 2011-01-21T14:59:44.410 回答
0

绝对是见仁见智。我ByRef不时使用参数,特别是对于需要成功/失败类型场景的实用程序功能。例如,TryParse.net 框架中的函数正是这样做的。您的参数化函数可能如下所示:

Public Function ParseTimeField(time As String, ByRef hours As Integer, ByRef minutes As Integer) As Boolean
    'Do stuff'
    ParseTimeField = True 'or false depending on output success'
End Sub

这意味着你可以这样称呼它:

Dim hours As Integer
Dim mins as Integer
If ParseTimeField(time, hours, mins) = True Then
    'It worked'
End If

然而,随着事情开始变得更加复杂,并且您实际上是在返回业务项目而不是执行逻辑命令,因此更需要一个单独的类和返回类型。它还使调用和返回更易于维护。

于 2011-01-21T14:42:13.497 回答