【実務・中級編】複数フォーム間のデータ受け渡し:プロパティ公開とイベント駆動を使い分けて保守性の高い画面遷移を実現する設計手法 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

フォーム間のデータ受け渡しを「魔境」にしないために:疎結合なUI設計の極意

業務アプリケーション開発において、初心者が最初に陥る最大の罠。それは「フォーム間の直接参照」と「グローバル変数による状態管理」です。

「`Form1.TextBox1.Text` を直接書き換える」「`Module` にPublic変数を山ほど定義して使い回す」。これらは開発初期こそ速いですが、数ヶ月後には「どの画面がいつ値を書き換えたのか追えない」という地獄のようなスパゲッティコードを生み出します。

本稿では、VB.NETでのWindows Forms開発を「保守可能な資産」に変えるための、プロフェッショナルな設計手法を伝授します。

1. なぜ「直接参照」は悪なのか?

フォーム同士が互いのコントロールを直接参照することは、「強結合」と呼ばれます。

  • カプセル化の欠如: 画面のコントロール名を変えただけで、参照元のコードが全滅します。
  • 再利用性の破壊: そのフォームを別のプロジェクトで使おうとしても、依存関係が深すぎて切り離せません。
  • デバッグの困難さ: どこで値が変更されたか特定できず、予期せぬタイミングでのデータ更新に悩まされます。

2. 解決策:プロパティ公開とイベント駆動の使い分け

設計の原則はシンプルです。「データはプロパティで流し込み、通知はイベントで吸い上げる」。これだけでフォーム間の結合度は劇的に下がります。

実践:子画面から親画面へ値を渡す(イベント駆動)

子画面で処理が完了した際、親画面に「データが更新された」ことを通知します。

子画面(ChildForm.vb)

Public Class ChildForm
‘ データ変更を通知するためのイベントを定義
Public Event DataAccepted(ByVal sender As Object, ByVal e As String)

Private Sub btnOk_Click(sender As Object, e As EventArgs) Handles btnOk.Click
‘ 自身の状態を公開するのではなく、イベントを介してデータを渡す
RaiseEvent DataAccepted(Me, txtInput.Text)
Me.Close()
End Sub
End Class

親画面(ParentForm.vb)

Private Sub btnShowChild_Click(sender As Object, e As EventArgs) Handles btnShowChild.Click
Using child As New ChildForm()
‘ イベントハンドラを登録(AddHandler)
AddHandler child.DataAccepted, AddressOf OnChildDataAccepted
child.ShowDialog()
End Using
End Sub

‘ 通知を受け取って処理する専用メソッド
Private Sub OnChildDataAccepted(sender As Object, e As String)
‘ ここで安全にデータを反映させる
lblResult.Text = e
End Sub

3. 堅牢な設計のための3つの掟

① グローバル変数は「読み取り専用」または「廃止」

もし設定ファイルやDB接続文字列を共有したいなら、`Public`変数ではなく、`Singleton`パターンを用いた設定クラスを介してください。グローバル変数は「どこからでも変更可能」なのが最大のリスクです。

② `Using` ステートメントの徹底

フォーム(`Form`)は `IDisposable` を実装しています。`ShowDialog` を使う際は必ず `Using` で囲み、メモリリークやハンドル不足を未然に防ぐのが鉄則です。

③ データベース連携は「画面」に書かない

画面コード(`.Designer.vb` や `.vb`)の中に `SQLConnection` を直書きしてはいけません。
データアクセスロジックは別クラス(`DataRepository` 等)に分離し、画面は「結果の受け取り」と「表示」に専念させるべきです。

4. プロダクション環境で生き残るためのコード設計

複雑なデータを受け渡す場合は、`String` や `Integer` のような単純型ではなく、「データ受け渡し専用クラス(DTO)」を作成してください。

‘ データ受け渡し用の構造体またはクラス
Public Class UserData
Public Property UserName As String
Public Property UserID As Integer
End Class

このように型を定義することで、コンパイル時に型チェックが働き、実行時の不整合を未然に防ぐことができます。

最後に:エンジニアの誇りとして

「動けばいい」コードは素人でも書けます。しかし、「誰が読んでも意図が明確で、変更に強いコード」を書くことこそが、自動化エンジニアとしての付加価値です。

フォーム間の通信をイベントに委ね、プロパティでデータを制御する。この小さな規律が、数年後のあなた自身を助けることになります。

さあ、今すぐあなたのプロジェクトの「Public変数」を削除し、イベント駆動の美しい設計へとリファクタリングを始めましょう。技術は使い手次第で、凶器にも救いにもなるのですから。

タイトルとURLをコピーしました