最佳实践:输出参数与方法中的复杂返回类型

时间:2011-01-21 13:53:54

标签: vb6 out-parameters complextype

使用复杂的返回类型:

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)

或使用输出参数:

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)

BTW这是VB6代码=)

4 个答案:

答案 0 :(得分:3)

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

通常,我发现多个ref / out参数是代码气味。如果需要从方法中返回数据,最好是在一个连贯的对象中。

答案 1 :(得分:2)

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

我通常更喜欢复杂的数据类型,因为我觉得这更符合函数的原始结构,其中输出参数在签名中的输入参数之前。基本上我不喜欢参数 - 它们是多余的。每当有两种方法在编程语言中做事时,你就会使不必要的事情变得复杂(猜测我会被Perl-fanatics说出来)。使用return语句返回数据。周期。

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

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

答案 2 :(得分:1)

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

在后一种情况下,通常会像这样使用retval

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

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

答案 3 :(得分:0)

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

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

然而,随着事情变得越来越复杂,并且您实际上正在返回业务项而不是执行逻辑命令,那么更理想的是单独的类和返回类型。它还使调用AND返回更容易维护。