使用复杂的返回类型:
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代码=)
答案 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返回更容易维护。