- PR -

VB2005 自作クラスをnewするタイミングで

1
投稿者投稿内容
ボビン
常連さん
会議室デビュー日: 2007/02/05
投稿数: 45
投稿日時: 2008-10-28 09:38
こんにちは、何気なく書いていたコードで疑問に思った点があり、
書き込みさせていただきます。

ログを単純に出力する自作クラスがあるとします。
↓↓↓

' ログクラス生成
m_ClsLog = New CL_LOG.CL_Log("ログファイル名", "ログのパス")

' ログ書き込み
Call m_ClsLog.Log_Write("処理:開始")

このようなクラスを複数のイベントで使用する場合、

1.初期起動時に標準モジュールで一度だけnewして、
各イベントでは、「Call m_ClsLog.Log_Write("処理:開始")」のみ書く。

又は、

2.各イベント内でnewも行う。

どちらが、妥当でしょうか?
両方で試してみましたが、特にメモリの使用量等は変化がありませんでした。
ということは、「1.標準モジュールで一度だけnewする」方がコードは見易くなります。
いかがでしょうか。

環境はVB2005で、winアプリです。
よろしくお願い致します。


nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2008-10-28 10:09
3.標準モジュールにLog_Writeメソッドそのものを書く。
ボビン
常連さん
会議室デビュー日: 2007/02/05
投稿数: 45
投稿日時: 2008-10-28 10:21
nakaPさん、お返事ありがとうございます。

>3.標準モジュールにLog_Writeメソッドそのものを書く。

ということは、こんな感じですか?

Public Sub LogWrite(ByVal sMsg As String)
    Call m_ClsLog.Log_Write(sMsg)
End Sub

「1.」に近いですね。コードもすっきりしそうですが他にメリット等あるのでしょうか。

「2.」のようにイベント内で何度もnewすることはパフォーマンス以外にもデメリット等弊害はあるのでしょうか。

この辺りの原則のようなものがあるのなら知りたいと思いまして。

よろしくお願い致します。

nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2008-10-28 11:46
引用:

ボビンさんの書き込み (2008-10-28 10:21) より:
この辺りの原則のようなものがあるのなら知りたいと思いまして。


原則とかはないと思いますけど、使い方としてあえてクラスを作る必要はないかなと。
標準モジュールを使って静的クラスのように使えばと思いまして。

メリットと言われると少しつらいですが、クラスインスタンスを意識しなくても良い(標準モジュールがインスタンスを持たないわけではない)というくらいでしょうか。
ボビン
常連さん
会議室デビュー日: 2007/02/05
投稿数: 45
投稿日時: 2008-10-28 12:01
なるほど、了解です。

>原則とかはないと思いますけど、使い方としてあえてクラスを作る必要はないかなと。
標準モジュールを使って静的クラスのように使えばと思いまして。

すみません、ちょっと言葉足らずだったかもしれません。
実際には、世代管理を行う機能がある等、もう少し複雑なクラスです。
すでに他システムで実績のあるクラスでして。

投稿した内容としては、あくまで色々なイベントで複数回使用されるクラスがあったとして、
newを行うタイミングは、どれがベストなのかと思い投稿致しました。

よろしければ、引き続きご意見を求めたいと思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-10-28 13:05
引用:

ボビンさんの書き込み (2008-10-28 12:01) より:

投稿した内容としては、あくまで色々なイベントで複数回使用されるクラスがあったとして、newを行うタイミングは、どれがベストなのかと思い投稿致しました。


nakaP さんの話の流れから 1 回の呼び出しで済ませたいということであれば、ラッパ クラスでもヘルパーモジュールでも何でも作ってそちらから呼び出せば、元のログのクラスに手を加える必要はありません。

引用:

実際には、世代管理を行う機能がある等、もう少し複雑なクラスです。


何でもありクラスの悪寒がしますね...

引用:

「2.」のようにイベント内で何度もnewすることはパフォーマンス以外にもデメリット等弊害はあるのでしょうか。


"New する" というのは 「新しいインスタンスを生成する」 という意味だと思いますが、このコストはそのクラスのコンストラクタの実装に依存します。 私たちにはその情報がないので何とも言えません。 気になるようであれば実測してみた方が早いですよ。

引用:

ということは、こんな感じですか?

Public Sub LogWrite(ByVal sMsg As String)
    Call m_ClsLog.Log_Write(sMsg)
End Sub


私は 「インスタンスの生成と後始末も込み」 だと思っていました。 ファイル出力関連のクラスであれば使用する都度後始末するのが一般的だと思っていましたので。

もし他の機能のせいでそれが難しいようであれば、たぶんクラス設計がおかしいと思います (業務上のことなので一概には言えませんが)。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ボビン
常連さん
会議室デビュー日: 2007/02/05
投稿数: 45
投稿日時: 2008-10-28 13:49
じゃんぬねっとさん、お返事ありがとうございます。

>nakaP さんの話の流れから 1 回の呼び出しで済ませたいということであれば、ラッパ クラスでもヘルパーモジュールでも何でも作ってそちらから呼び出せば、元のログのクラスに手を加える必要はありません。

了解です。今回はモジュールからの呼び出しで実装しようと思います。

>私は 「インスタンスの生成と後始末も込み」 だと思っていました。 ファイル出力関連のクラスであれば使用する都度後始末するのが一般的だと思っていましたので。

もし他の機能のせいでそれが難しいようであれば、たぶんクラス設計がおかしいと思います (業務上のことなので一概には言えませんが)。

そうですね。
すぐにログクラスのソースを確認できない状態ですが、
見ることができ次第、クラス設計も含めて見直してみます。

nakaPさん、じゃんぬねっとさん、貴重なご意見ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)