- - PR -
共有定義モジュールについて
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-02-05 11:55
こんにちは。VB2005で開発をしています。
わからないことをこちらでいつも参考にさせていただいて助かっています。 VB6で6年ほど開発を行い、VB2005で開発するようになって 約半年です。オブジェクト指向プログラミングができるように四苦八苦しています。 今回はVB6でいう、モジュールやPublic変数について、 VB2005ではどう書くのがベストかわからなくなり、ご質問させて下さい。 例えば、DBにログイン、select、結果をDetaset型で返すメソッド1や、 ログイン、トランザクション、update、クローズを行った結果をboolean型で返すメソッド2が 定義されたクラスAがあり、そのクラスは各フォームからよく使われることが 多いので、モジュールで Public classA As New クラスA と書いて、どこからでもメソッド1やメソッド2が使えるようにしています。 この書き方はやはりオブジェクト指向のプログラミングとはいえないですよね? こういう場合は、クラスAを使いたいプロシージャで毎回、 Dim classA As New クラスA とした方がいいのでしょうか?ほとんどのプロシージャで使う場合、 何度も書くことになります。 又は別の方法が正しいのでしょうか。 クラサバのwindowsフォームアプリケーションを開発しています。 見たほうがいいサイトやスレッドがあればリンクでもありがたいです。 どうぞよろしくお願いします。 | ||||||||||||
|
投稿日時: 2007-02-05 12:28
クラスAをメソッドしか持たない(フィールド・プロパティのない)クラスとして
設計することをお考えなら、Sharedメソッドとするのが普通です。 Sharedメソッドは[クラス名].[メソッド名]という形式で呼び出せますのでNewで インスタンスを生成する必要はありません。 ただし、この設計もあまり「オブジェクト指向的」ではないと思います。 オブジェクト指向的にはデータと手続きをクラスにまとめるのが普通です。 クラスAの中にフィールド等でデータを保持し、「データベースからのデータの取得」のメソッド (戻り値で返すのではなく取得したデータをフィールドに格納する)を含めた、 そのデータに対する一般的な処理をクラスAのSharedでないメソッドとして定義する方が普通だと思います。 ただし、オブジェクト指向にはいろいろな設計パターンがありますので、あくまで一例に過ぎません。 | ||||||||||||
|
投稿日時: 2007-02-05 13:01
全然定義じゃないし。 | ||||||||||||
|
投稿日時: 2007-02-05 13:46
KIさん、早速のお返事ありがとうございます。 では、フィールドやプロパティをもつクラスの場合は、 やはり使用する度に、インスタンス化して使うのが普通なのですね。 職場に詳しい人がいないのでお返事がとても助かります。 ぶさいくろうさん、お返事ありがとうございます。 Public AppPath As String Public Const intSize As Integer = 862 このような変数を定義して何度も使う必要がある場合は、 publicプロパティ、AppPathと privateフィールド、_AppPathに分けて 使用する毎にインスタンス化して使った方がいいのか (例え Dim classA As New クラスA とたくさん書くことになっても)、 それとも現状のように一度だけ Public classA As New クラスA と書いてしまってどこからでも使えるようにすることも「あり」なのか。 オブジェクト指向に沿っていない書き方なんだろうな、と 疑問に思っていたのでこのような件名にしました。 この部分を書くと質問が長くなったので、削除したのが間違いでした。 申し訳ありません。 | ||||||||||||
|
投稿日時: 2007-02-05 14:31
私は少し意図を勘違いしていたようです。 このように1つのインスタンスを共有して事足りるようなクラスであれば、むしろ共有すべきだと思います。 インスタンス毎に異なる値を保持するフィールドを持つようなクラスなら、 当然共有できませんので、使う箇所それぞれでインスタンスを生成するというスタイルになります。 この場合、AppPathやintSize(こちらはConstなので当たり前ですが)は、おそらく プログラムのどの箇所から参照するときも同じ値なのですよね? でしたら、わざわざNewする使い方
これよりは、以下の方が普通だと思います。
オブジェクト指向的かどうかは置いておいて…ですが。 | ||||||||||||
|
投稿日時: 2007-02-05 14:51
これは、Shared メンバで良いと思います。 後者のような定数は、列挙体を使った方が良い場合もありますが。 (ここで、返信を書いている途中に被っていることに気付いたので割愛) 付け加えるとすれば、Shared フィールドは、ReadOnly メンバにすべきというガイドラインがあります。 コンパイル時に値が決定しているならば、Const メンバです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2007-02-05 15:39
こんにちは。
実際に、こういうプログラムよく見かけますね(残念なことに)。 方法は…いろいろあると思います。 そこは技術者(設計者・プログラマ)の腕の見せ所ですね。 こういう書き方が本当に綺麗な書き方なのか? もっとウマイ書き方があるんじゃないか? と疑問を持つことは、非常に良いことだと思います。 | ||||||||||||
|
投稿日時: 2007-02-05 16:07
KIさん、度々ありがとうございます。 色々調べてこんがらがってきた知識が、整理されていくようです。 今回のような場合、Shared を付けて宣言し、クラス名.フィールド名として参照するのですね。 今回のようにインスタンス化せずに使うフィールドやメソッドと、 毎回異なる値が入る、インスタンス化して使うフィールドやメソッドがあり、 それぞれの意味が同じカテゴリとした場合、クラスは分けて作成すべきでしょうか。 それとも1つのクラスにまとめても、問題ないでしょうか。
じゃんぬねっとさん、お返事ありがとうございます。勉強になります。 オブジェクト指向ではない半端な作り方が身に付く前に、 一般的なオブジェクト指向のルールを頭に叩き込みたいと思っています。
Tdnr_Symさん、お返事ありがとうございます。 自分で書いていて、なんだか同じことを何度も書くのっておかしいな、と思っていました。 参考書を読んでいても、モジュールの使い方は説明されているのですが、 実際に使ってもいいのか、プログラミングのルールのようなものが説明されていないことが多く、 もやもやとしていました。 こちらで質問させていただいて良かったです(^^) |