2010-12-07 10 views
4

以下のgetFile関数で使用されているように、ByValとByRefの両方のパラメータを持つ関数を記述するのは悪い習慣(VB.NETまたは任意の言語)ですか?ByRefとByValパラメータを同じルーチンで渡すのが悪いのですか?

Function getFile(ByVal channel As Integer, _ 
       ByRef Filename As String, _ 
       ByRef Filesize As String) As Integer 
... 
End Function 

... 
Dim status As Integer 
Dim filename As String 
Dim filesize As Integer 

For channel In 1 To 16 
    status = getFile(channel, filename, filesize) 
    ... 
Next channel 
+3

このメカニズムが役立つところがわかりますが、最終的にはメソッドの出力が乱雑になります。 整数と(時には)ファイル名/ファイルサイズを返します。私は3つのタイプの情報を持つ単純な構造体を返します。 – Assaf

答えて

6

私は通常ByRefを避けようとしますが、しばしば醜く混乱します。 ByValByRefを混在させているだけでは、あくまですべてがByRef IMHOであること以上の読みやすさには影響しません。

たとえば、ファイル名だけが必要な場合は、filesize変数を渡す必要があります。これは少し醜いと思います。また、コードを読むときにパラメータが変更される可能性もあります。

Assafも彼のコメントで言うように、代わりに私は通常、メソッドがすべての戻りデータを含むことができる何らかの構造を返すようにすることで、問題全体を回避しようとします。失敗した場合はステータスを返すのではなく例外をスローします(ステータスが何らかのエラーであると仮定して)。

+1

合意。必要に応じてbyrefとbyvalを使用すると、あなたは金になります。ほとんどのパラメータは一方通行であり、渡されるので、byvalであるべきです(SHOULD)。場合によっては、渡されたパラメータを変更できる必要があります。スーパー共通ではありませんが、それがByrefを持っている理由です。 – DarinH

+2

私は、関数が値を返す必要がある場合は、通常、関数が関数の戻り値であり、byrefパラメータではないことを確認するのが最善の方法です。 – DarinH

+2

関数が複数の値を返す必要がある場合は、その目的のために特別にクラスまたは構造体を作成する必要があります。 – DarinH

関連する問題