VB初心者です。
プログラム作成を行う上で、疑問があります。
どちらの方法が正解なのかわかりません。
正解とは、メモリの占有率や処理速やプログラムソースのわかりやすさ
等、いろいろな側面がある思いますが、プロの皆さんは一般的にどちら
の方法で記述されるんでしょうか。お教えください。
方法1:引数を使用する。
方法2:共通変数を使用する。
<方法1>=========================================
Private Sub 処理1()
Dim 大きい変数 As XXXXXXXX
Dim 結果 As XXXXXXXX
大きい変数に値を代入
結果 = 処理2(大きい変数)
End Sub
Private Function 処理2(大きい変数 As XXXXXXXX)
処理2 = 大きい変数に対して処理
End Function
<方法2>=========================================
Private 大きい変数 As XXXXXXXX
Private Sub 処理1()
Dim 大きい変数 As XXXXXXXX
Dim 結果 As XXXXXXXX
大きい変数に値を代入
結果 = 処理2
End Sub
Private Function 処理2()
処理2 = 大きい変数に対して処理
End Function
※書き間違えかも知れませんが,方法1と方法2は同じ意味にはなりません.
私の意見ですが
・(オブジェクトのメソッドの意味ではない)関数へは,全て必要な値をそろえて渡す.
・オブジェクトのメソッドへは,オブジェクトの内部状態を加味しつつその場で必要な値も渡す.
という区別をしています.
今回の場合,初見では<方法1>の"処理2"はオブジェクトの内部状態を加味しないため,「関数」であり,
<方法2>の"処理2"はオブジェクトの内部状態を加味しているため,「オブジェクトのメソッド」である.
という認識で,どちらもありうるものと思います.
で,
> 正解とは、メモリの占有率や処理速…
確かにそのような側面もありますが.
それはあくまで「ソースが分かりやすい」上で成り立つものだと考えています.
そしてそのあたりは計算アルゴリズムの本を読みつつ,ですね.
今回の例ではアルゴリズムを考慮する必要は無いと思いますので,どちらも正しいと思います.
>大きい変数
ってのがちょっと気になりました。
値型の変数では Double の 64bit
参照型の変数では参照アドレス(32bit?)
なので、大きくならないですよね?
引数で使用しても、使ってるメモリ量が
大きいから問題になることは無いはずです。
>メモリの占有率や処理速
これは処理1をループ内で呼びまくって
タスクマネージャなどで調べれば分かる
ことでは?
ボクも他でも使える関数の形にする場合は、
依存しないように<方法1>ですね。
クラス内の内部メソッドは、クラスのメンバ
変数を<方法2>で参照することが多いです。
ご回答ありがとうございます。
お2人のような博学な方のご回答を頂け感謝感激です。
この質問には、いろいろな側面があり何が正解かは使用
目的や使用の場面で変化してくるとは思っていましたが
プロの方々の一般的は癖みたいのが、感じ取れたらと質
問させていただきました。
ここで処理速度のみに限定した場合ならいかがでしょう?
方法1の場合、Functionを呼び出す毎に、引数をスタッ
クに退避または設定するステップが必要なので、その都
度マシンコードレベルでは、1ステップ余分になる気が
するのですが。
Functionを呼び出す回数が膨大なほど方法2に比べて速
度は遅くなるとの考え方は間違っていますでしょうか?
最終的にどちらが正解かを結論付けるつもりはありませ
んがもう少し皆さんのご意見をお聞きしたいので、いま
しばらく開けていさせてください。
それぞれの引数の意味がわかりませんが,外部から渡すという手段がある以上,オブジェクトの状態ではないのでしょう。
ならば,私は引数として渡します。
フィールドを使うということは,オブジェクトの状態を表している,という意味があります。
なので,そうでないものをフィールドとしてしまうと,後々「なぜフィールドなのか」がわからなくなります。
あくまで私にとっての視点は「オブジェクトの状態かどうか」です。
> ここで処理速度のみに限定した場合ならいかがでしょう?
一般的には,処理速度を気にする場合にこの2つの方法を比べること自体,意味がありません。
> 方法1の場合、Functionを呼び出す毎に、引数をスタッ
> クに退避または設定するステップが必要なので、その都
> 度マシンコードレベルでは、1ステップ余分になる気が
> するのですが。
その結果関数内部でのI/Oの局所化が進み,キャッシュミスが減れば,最終的な速度は速くなるかもしれません。
理論上 1 clock 余計にかかる処理も,実際の実行ではどちらが速く処理出来るかはわかりません。
なので,再度書きますが「気にすることに意味がない」のです。
処理速度に問題がある場合,通常はプロファイラの結果を見ながら SQL やアルゴリズムに手をつけます。
(見た目上) 1ステップ減らすなどという些細な目的のために引数からフィールドに移動するなどということは,
まともなプログラマならやらないでしょう。
# 専用ブランチ切って,そこへ手を加えるのなら最後の手段としてあるかもしれませんが……。
>ここで処理速度のみに限定した場合ならいかがでしょう?
実際にやったら結果が出るのではないでしょうか?
みなさん。貴重なご意見と親切なご回答ありがとう
ございました。
いろいろな側面での正解はそれぞれちがうと思いま
すし、また実際にやってみて比較すべきでしょう。
ただ、一般的にプロの皆さんの技といますか、傾向
といいますか、そんなものに興味がありました。
お付き合いいただき本当にありがとうございました。
ツイート | ![]() |