どちらが正解?

解決


初心者  2007-12-30 07:47:59  No: 138521

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


ガッ  2007-12-30 08:31:42  No: 138522

※書き間違えかも知れませんが,方法1と方法2は同じ意味にはなりません.

私の意見ですが
・(オブジェクトのメソッドの意味ではない)関数へは,全て必要な値をそろえて渡す.
・オブジェクトのメソッドへは,オブジェクトの内部状態を加味しつつその場で必要な値も渡す.
という区別をしています.

今回の場合,初見では<方法1>の"処理2"はオブジェクトの内部状態を加味しないため,「関数」であり,
<方法2>の"処理2"はオブジェクトの内部状態を加味しているため,「オブジェクトのメソッド」である.
という認識で,どちらもありうるものと思います.

で,
> 正解とは、メモリの占有率や処理速…
確かにそのような側面もありますが.
それはあくまで「ソースが分かりやすい」上で成り立つものだと考えています.
そしてそのあたりは計算アルゴリズムの本を読みつつ,ですね.
今回の例ではアルゴリズムを考慮する必要は無いと思いますので,どちらも正しいと思います.


特攻隊長まるるう  2007-12-30 20:16:35  No: 138523

>大きい変数
ってのがちょっと気になりました。

値型の変数では Double の 64bit
参照型の変数では参照アドレス(32bit?)
なので、大きくならないですよね?
引数で使用しても、使ってるメモリ量が
大きいから問題になることは無いはずです。

>メモリの占有率や処理速
これは処理1をループ内で呼びまくって
タスクマネージャなどで調べれば分かる
ことでは?

ボクも他でも使える関数の形にする場合は、
依存しないように<方法1>ですね。

クラス内の内部メソッドは、クラスのメンバ
変数を<方法2>で参照することが多いです。


初心者  2007-12-30 22:49:29  No: 138524

ご回答ありがとうございます。
お2人のような博学な方のご回答を頂け感謝感激です。
この質問には、いろいろな側面があり何が正解かは使用
目的や使用の場面で変化してくるとは思っていましたが
プロの方々の一般的は癖みたいのが、感じ取れたらと質
問させていただきました。
ここで処理速度のみに限定した場合ならいかがでしょう?

方法1の場合、Functionを呼び出す毎に、引数をスタッ
クに退避または設定するステップが必要なので、その都
度マシンコードレベルでは、1ステップ余分になる気が
するのですが。
Functionを呼び出す回数が膨大なほど方法2に比べて速
度は遅くなるとの考え方は間違っていますでしょうか?

最終的にどちらが正解かを結論付けるつもりはありませ
んがもう少し皆さんのご意見をお聞きしたいので、いま
しばらく開けていさせてください。


YuO  2007-12-31 00:24:47  No: 138525

それぞれの引数の意味がわかりませんが,外部から渡すという手段がある以上,オブジェクトの状態ではないのでしょう。
ならば,私は引数として渡します。

フィールドを使うということは,オブジェクトの状態を表している,という意味があります。
なので,そうでないものをフィールドとしてしまうと,後々「なぜフィールドなのか」がわからなくなります。

あくまで私にとっての視点は「オブジェクトの状態かどうか」です。

> ここで処理速度のみに限定した場合ならいかがでしょう?

一般的には,処理速度を気にする場合にこの2つの方法を比べること自体,意味がありません。

> 方法1の場合、Functionを呼び出す毎に、引数をスタッ
> クに退避または設定するステップが必要なので、その都
> 度マシンコードレベルでは、1ステップ余分になる気が
> するのですが。

その結果関数内部でのI/Oの局所化が進み,キャッシュミスが減れば,最終的な速度は速くなるかもしれません。
理論上 1 clock 余計にかかる処理も,実際の実行ではどちらが速く処理出来るかはわかりません。
なので,再度書きますが「気にすることに意味がない」のです。

処理速度に問題がある場合,通常はプロファイラの結果を見ながら SQL やアルゴリズムに手をつけます。
(見た目上) 1ステップ減らすなどという些細な目的のために引数からフィールドに移動するなどということは,
まともなプログラマならやらないでしょう。
# 専用ブランチ切って,そこへ手を加えるのなら最後の手段としてあるかもしれませんが……。


通ってみた  2007-12-31 03:50:57  No: 138526

>ここで処理速度のみに限定した場合ならいかがでしょう?

実際にやったら結果が出るのではないでしょうか?


初心者  2008-01-01 07:06:31  No: 138527

みなさん。貴重なご意見と親切なご回答ありがとう
ございました。
いろいろな側面での正解はそれぞれちがうと思いま
すし、また実際にやってみて比較すべきでしょう。
ただ、一般的にプロの皆さんの技といますか、傾向
といいますか、そんなものに興味がありました。

お付き合いいただき本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加