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

戻り値の型が 1 つの場合は、out パラメーターを使用してそれを返さないでください。

一般的に、複数のref/outパラメータはコードの匂いだと思います。メソッドからデータを返す必要がある場合は、それが 1 つの一貫したオブジェクトにある方がよいでしょう。

于 2011-01-21T13:57:47.980 に答える
2

この件に関しては、さまざまな意見が見られると思います。ベストプラクティスが存在するかどうかはわかりません。

私は通常、複雑なデータ型を好みます。これは、署名で出力パラメーターが入力パラメーターに先行する関数の元の構造とより一致していると感じるからです。基本的に私は out パラメータが好きではありません - それらは不必要です。プログラミング言語で物事を行う方法が 2 つある場合はいつでも、不必要に複雑になります (これを述べている Perl 狂信者に殺されると思います)。return ステートメントでデータを返します。限目。

つまり、自然なグループ化を持たない 2 つのパラメーターを返す必要がある場合、つまり、この特定の関数の戻り値でのみ使用されるクラスになってしまうということです。

戻りデータに 3 つ以上のパラメーターがある場合は常に、呼び出しコードが過度に冗長であることがわかったという理由だけで、変数 (または C# の var'em) を Dim する必要があるため、決して out を使用しません。

于 2011-01-21T14:09:09.907 に答える
1

私は普遍的なスタイルとしてパラメータを使用する傾向があります。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 に答える