- PR -

共有定義モジュールについて

投稿者投稿内容
ボビン
常連さん
会議室デビュー日: 2007/02/05
投稿数: 45
投稿日時: 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フォームアプリケーションを開発しています。

見たほうがいいサイトやスレッドがあればリンクでもありがたいです。
どうぞよろしくお願いします。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-02-05 12:28
クラスAをメソッドしか持たない(フィールド・プロパティのない)クラスとして
設計することをお考えなら、Sharedメソッドとするのが普通です。
Sharedメソッドは[クラス名].[メソッド名]という形式で呼び出せますのでNewで
インスタンスを生成する必要はありません。

ただし、この設計もあまり「オブジェクト指向的」ではないと思います。
オブジェクト指向的にはデータと手続きをクラスにまとめるのが普通です。
クラスAの中にフィールド等でデータを保持し、「データベースからのデータの取得」のメソッド
(戻り値で返すのではなく取得したデータをフィールドに格納する)を含めた、
そのデータに対する一般的な処理をクラスAのSharedでないメソッドとして定義する方が普通だと思います。

ただし、オブジェクト指向にはいろいろな設計パターンがありますので、あくまで一例に過ぎません。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-02-05 13:01
引用:

共有定義モジュールについて


全然定義じゃないし。
ボビン
常連さん
会議室デビュー日: 2007/02/05
投稿数: 45
投稿日時: 2007-02-05 13:46
引用:

KIさんの書き込み (2007-02-05 12:28) より:

クラスAの中にフィールド等でデータを保持し、「データベースからのデータの取得」のメソッド
(戻り値で返すのではなく取得したデータをフィールドに格納する)を含めた、
そのデータに対する一般的な処理をクラスAのSharedでないメソッドとして定義する方が普通だと思います。




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
と書いてしまってどこからでも使えるようにすることも「あり」なのか。

オブジェクト指向に沿っていない書き方なんだろうな、と
疑問に思っていたのでこのような件名にしました。

この部分を書くと質問が長くなったので、削除したのが間違いでした。
申し訳ありません。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-02-05 14:31
引用:

それとも現状のように一度だけ Public classA As New クラスA
と書いてしまってどこからでも使えるようにすることも「あり」なのか。



私は少し意図を勘違いしていたようです。
このように1つのインスタンスを共有して事足りるようなクラスであれば、むしろ共有すべきだと思います。
インスタンス毎に異なる値を保持するフィールドを持つようなクラスなら、
当然共有できませんので、使う箇所それぞれでインスタンスを生成するというスタイルになります。

この場合、AppPathやintSize(こちらはConstなので当たり前ですが)は、おそらく
プログラムのどの箇所から参照するときも同じ値なのですよね?
でしたら、わざわざNewする使い方

コード:
'クラス定義部
Public Class ClassA
    Public AppPath As String = "abc"
    Public Const intSize As Integer = 862

    Public Function GetData() As DataSet
End Class


'使う箇所
Dim a As New ClassA()
Dim s As String = a.AppPath
Dim ds As DataSet = a.GetData()


これよりは、以下の方が普通だと思います。

コード:
'クラス定義部
Public Class ClassA
    Public Shared AppPath As String = "abc"
    Public Const intSize As Integer = 862 

    Public Shared Function GetData() As DataSet
End Class


'使う箇所
Dim a As New ClassA()
Dim s As String = ClassA.AppPath
Dim ds As DataSet = ClassA.GetData()


オブジェクト指向的かどうかは置いておいて…ですが。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-05 14:51
引用:

ボビンさんの書き込み (2007-02-05 13:46) より:

  Public AppPath As String
  Public Const intSize As Integer = 862

このような変数を定義して何度も使う必要がある場合は、

  publicプロパティ、AppPathと
  privateフィールド、_AppPathに分けて

使用する毎にインスタンス化して使った方がいいのか
(例え Dim classA As New クラスA とたくさん書くことになっても)、


これは、Shared メンバで良いと思います。
後者のような定数は、列挙体を使った方が良い場合もありますが。

(ここで、返信を書いている途中に被っていることに気付いたので割愛)

付け加えるとすれば、Shared フィールドは、ReadOnly メンバにすべきというガイドラインがあります。
コンパイル時に値が決定しているならば、Const メンバです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-02-05 15:39
こんにちは。

引用:

ボビンさんの書き込み (2007-02-05 11:55) より:
こういう場合は、クラスAを使いたいプロシージャで毎回、

  Dim classA As New クラスA

とした方がいいのでしょうか?ほとんどのプロシージャで使う場合、
何度も書くことになります。
又は別の方法が正しいのでしょうか。



実際に、こういうプログラムよく見かけますね(残念なことに)。

方法は…いろいろあると思います。
そこは技術者(設計者・プログラマ)の腕の見せ所ですね。

こういう書き方が本当に綺麗な書き方なのか?
もっとウマイ書き方があるんじゃないか?
と疑問を持つことは、非常に良いことだと思います。
ボビン
常連さん
会議室デビュー日: 2007/02/05
投稿数: 45
投稿日時: 2007-02-05 16:07
引用:


私は少し意図を勘違いしていたようです。
このように1つのインスタンスを共有して事足りるようなクラスであれば、むしろ共有すべきだと思います。
インスタンス毎に異なる値を保持するフィールドを持つようなクラスなら、
当然共有できませんので、使う箇所それぞれでインスタンスを生成するというスタイルになります。



KIさん、度々ありがとうございます。
色々調べてこんがらがってきた知識が、整理されていくようです。
今回のような場合、Shared を付けて宣言し、クラス名.フィールド名として参照するのですね。

今回のようにインスタンス化せずに使うフィールドやメソッドと、
毎回異なる値が入る、インスタンス化して使うフィールドやメソッドがあり、
それぞれの意味が同じカテゴリとした場合、クラスは分けて作成すべきでしょうか。
それとも1つのクラスにまとめても、問題ないでしょうか。

引用:


付け加えるとすれば、Shared フィールドは、ReadOnly メンバにすべきというガイドラインがあります。 コンパイル時に値が決定しているならば、Const メンバです。



じゃんぬねっとさん、お返事ありがとうございます。勉強になります。
オブジェクト指向ではない半端な作り方が身に付く前に、
一般的なオブジェクト指向のルールを頭に叩き込みたいと思っています。

引用:


実際に、こういうプログラムよく見かけますね(残念なことに)。



Tdnr_Symさん、お返事ありがとうございます。
自分で書いていて、なんだか同じことを何度も書くのっておかしいな、と思っていました。
参考書を読んでいても、モジュールの使い方は説明されているのですが、
実際に使ってもいいのか、プログラミングのルールのようなものが説明されていないことが多く、
もやもやとしていました。
こちらで質問させていただいて良かったです(^^)

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