早速ですが、今回の題目変更です(笑)
パラメータを関数や手続き内であまり使わない方がいい
と言う方針で記事を書くつもりだったのですが、
最近の言語は値渡し、参照渡しなどがあって、
必ずしもパラメータを直接使うことによるロスが発生するとは限らないようです。
一部の言語はパラメータで渡された変数は、コピーされず、
呼び出し元の変数を直接参照しに行きました。
パラメータを使うたびに、メモリの別エリアを参照しに行くのです。
このオーバーヘッドを防ぐために、
パラメータの値は処理の先頭で、ローカル変数に移しました。
で、その代わりに、値渡しと参照渡しについてです。
値渡しはその名の通り「値で渡す」ことです。
Function FNC_A(ByVal pi_1 as integer,ByVal pi_2 as string,ByVal pi_3 as boolean) as boolean
pi_1,pi_2,pi_3は値渡しとして定義されています。呼び出す時は、
dim x as integer
dim y as string
dim z as boolean
x = 10
y = "サンプル"
z = false
ret = FNC_A(x,y,z)
まぁ、こんな感じですが、
実際に動くときは、x,y,zの内容はpi_1,pi_2,pi_3にコピーされます。
別物になるわけです。
したがって、pi_1,pi_2,pi_3に一生懸命代入しても、x,y,zは変化しません。
次に参照渡しです。
Function FNC_A(ByRef pio_1 as integer,ByRef pi_2 as string,ByRef po_3 as boolean) as boolean
pio_1,pi_2,po_3は参照渡しとして定義されています。呼び出す時は、
dim x as integer
dim y as string
dim z as boolean
x = 10
y = "サンプル"
ret = FNC_A(x,y,z)
pio_1,pi_2,po_3は参照渡しということで、その変数の場所が渡されます。
パラメータ(pio_1,pi_2,po_3)は変数(x,y,z)の場所を表し、
その内容を読みだすことも、書き換えることもできます。
つまり、値渡しとは違い、パラメータは変数そのものを指しているのです。
サンプルで説明すると、
pio_1は、入出力用のパラメータで、
xの値を読み出し、書き換える目的で定義されています。
pi_2は、入力用のパラメータで、
yの値を読み出す目的で定
義されています。
もちろん、pi_2の値を書き換えることも可能ですが、
ここはネーミングルールに従って書き換え不可と理解してください。
po_3は出力用パラメータで、
zの値を書き換えます。
出力パラメータなので、呼び出し元でzの値を設定する必要はありません。
設定してもよいのですが、ネーミングルールに従って、
その値は参照されることはありません。
さくっとこんな感じです。
これらから、po_,pio_は参照渡しでないといけないというルールが追加されますね。
ちなみに、pi_は値渡しだけにすればいいんじゃないか!?
という疑問も生まれると思いますが、
非常に大きな変数などを渡す時は、
コピーを作らない分、参照渡しの方が高速で動きます。
この辺を踏まえて設計するといいと思います。