クラスの呼び元について

解決


ちっぽけなプログラマー  2005-07-20 23:06:48  No: 123594

下記の(処理内容)にある処理します。(実際はもっと複雑)
(処理方法)に記述したどちらの方法が良いでしょうか。
また、別に良い方法があるなら教えてください。

(処理内容)
  ・DBからデータをSELECTする。
  ・取得したデータを編集する。
  ・編集したデータをINSERTする。
(処理方法1)
  フォーム側でクラスに記述したSELECTや編集、INSERTを
  それぞれ呼び出し、処理を行う。

''フォーム
    Private Sub Button1_Click
        call Select
        call Edit
        call Insert
    End Sub
    
''クラス
    Public Sub Select
        ''Select処理
    End Sub
    Public Sub Edit
        ''編集処理
    End Sub
    Public Sub Insert
        ''Insert処理
    End Sub

(処理方法2)
  クラス内に、SELECTや編集、INSERTを呼ぶものを作り、
  フォーム側から、それを呼ぶ。

''フォーム
    Private Sub Button1_Click
        call Main
    End Sub
    
''クラス
    Public Sub Main
        call Select
        call Edit
        call Insert
    End Sub
    Public Sub Select
        ''Select処理
    End Sub
    Public Sub Edit
        ''編集処理
    End Sub
    Public Sub Insert
        ''Insert処理
    End Sub
    
なお、上記コードは質問の行数を減らす為、すべて"call"にしています。


特攻隊長まるるう  2005-07-21 00:22:23  No: 123595

ぐーぐる検索『クラス化 オブジェクト指向』
http://www.google.com/search?hl=ja&q=%E3%82%AF%E3%83%A9%E3%82%B9%E5%8C%96+%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91&lr=


ちっぽけなプログラマー  2005-07-21 18:55:41  No: 123596

>特攻隊長まるるう様、ありがとうございます。
一通り呼んでみました。わかったような・・・わからないような・・・
状態です。いい機会だと思って、オブジェクト指向をしっかりと勉強します。
というわけで、とりあえず解決とします。


特攻隊長まるるう  2005-07-21 20:31:48  No: 123597

>いい機会だと思って、オブジェクト指向をしっかりと勉強します。
はい。その言葉が頂ければボクなりの解釈を書いても問題ないでしょう。

まず、[VB6.0]だと Form オブジェクトはその名称がインスタンス(実体)
を指す変数として使えて、ちょっと特殊な解釈が必要だと思うんですが、
[VB.NET]になって『Form もクラスである』という概念がはっきりする
と、Form か?クラスか?の違いはどっちもクラスなんだから、目的に
応じて纏めれば良いのでは?…と思います。

ぐーぐる検索で幾つかのサイトに目を通して頂けたなら、純粋な意味で
クラス化として有効なものは『抽象化』できるものと理解して頂けたと
思います。これは1つの部品として再利用できる形にし、生産性を上げたり、
データと手続きを一体化させる『カプセル化』や決められた手続き以外には
データを扱うことができない『情報隠蔽』や属性や機能を別のものから受け
継ぐ『インヘリタンス(継承)』などに繋がるものです。最終的に『ポリモー
フィズム』『オブジェクト指向』に行き着きます。

具体的に TextBox クラスを考えます。入力を必要とするアプリケーションで
同じモノを流用できます。ユーザの入力に対し文字列データを処理します。
文字列以外のデータを貼り付けたり出来ないように一定の手続きが決められて
います。TextBox クラスの動きをそのまま利用して、ドロップダウンリスト
と組み合わせれば ComboBox クラスに継承できます。

このような設計になっていると、クラス化する意味が出てきます。

質問の内容に戻りますと、おそらくこのクラスは他のアプリで利用できる
形ではありませんよね?特に Edit の内部処理なんて、このアプリでしか
使えない固有のモノでしょう?その時点で『純粋な意味で』クラス化する
意味は無くなっているのではないでしょうか?。つまり、Form 側にサブ
プロシージャ(関数)として全て作成しても問題ないレベルでは?…という
事です。

まぁ、ただ、『純粋じゃナイ意味で』はクラス化した方が理解しやすい
場合は多々あります。ぐーぐる検索『クラス化 必要』ではこんなもの
も引っ掛かりました。色々な切り口で調べてみて下さい。
[データベース系アプリケーションで、データや処理をどこまでクラス化する?]
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13071&forum=25&16

質問のコードですが、例えば、色々な処理をするメインフォーム Form1 から、
データベース検索の為の Form2 を表示します。Form2 のボタン押下で Select
Edit Insert ならどうコーディングしますか?Form2 のボタン押下イベント内に
記述しますか?。Form2 をクラスに置き換えて考えるとクラス内に記述する事に
なりますね。でも Form2 の操作を Form1 からすると… Form1 に記述する事に
なります。…この時点ではどちらでも良いでしょう。

では更に Form3 から Form2 を呼び出す場合は?同じ Select Edit Insert
処理があるなら Form2 に書いてないと2箇所に書く必要が出てきます。メンテ
ナンスで修正が入ると複数箇所で修正が発生します。修正漏れの可能性も。
…ただし Form2 を引数にモジュールに渡して1箇所に纏める…って解決方法も
あります。

ってな感じで考えて、いくら抽象化って言っても抽象化した部品だけでアプリは
作れません。どっかのクラスに抽象化できない処理は絶対書いてあります。
抽象化できない処理のみ纏めたクラス…ってアリかな?…定数なら標準モジュール
に Const で書いてあったりしますが…。
・目的(データベース処理・ファイル操作処理・通信処理…etc)を意識して纏めてみる。
・2箇所以上に全く同じ処理を書くなら考えてみる。
・ただし、解決法は『サブプロシージャ化』『モジュール化』『クラス化』など
1つではない。
って観点から考えてみてはどうでしょう?
とりあえず過去ログ検索『クラス化』…でサブクラス化以外の話題↓
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200112/01120001.txt
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200210/02100001.txt
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200404/04040001.txt


ちっぽけなプログラマー  2005-07-21 23:12:38  No: 123598

ご丁寧な説明、ありがとうございます。
私も人に自分なりの考え等も話せる様になる為、
まずは基本的な知識を深めていきます。


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

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






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