【実務・中級編】Windows Formsの画面遷移における状態保持とメモリ管理:複数フォーム間の密結合を断ち切りDIコンテナを活用した保守性の高い設計 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

泥沼の画面遷移に終止符を:VB.NETにおける「脱・密結合」アーキテクチャの極意

業務アプリケーションの現場で最も頻発する「負の遺産」を知っているか?それは、`Form1.Show()` を乱発し、`Public Shared` でデータを共有し、果ては `Form2` から `Form1` を直接操作するようなスパゲッティコードだ。

「とりあえず動く」で作られたそのコードは、半年後の仕様変更で確実に破綻する。メモリリーク、予期せぬイベントの多重発火、そして「どこで値が書き換わったか追えない」地獄。

今日は、Visual Basic(VB.NET)で堅牢な業務アプリを構築するための、依存性の注入(DI)を用いたクリーンな画面遷移設計を伝授する。これは小手先のテクニックではない。保守性を極限まで高めるための「設計思想」だ。

—

1. なぜ「Form間の直接参照」が癌なのか

VB.NETの初心者ほど、`Form2` のインスタンス内で `Form1.TextBox1.Text = “値”` のように直接操作したがる。これは絶対悪だ。

  • 依存関係の隠蔽: どの画面がどの画面を必要としているか、コードを見ただけでは理解不能になる。
  • テストの不可能性: `Form1` が存在しない環境では `Form2` を単体テストすることすらできない。
  • メモリ管理の崩壊: 不要になった画面がインスタンスとして残り続け、GC(ガベージコレクション)を阻害する。

これらを断ち切る唯一の方法が、「インターフェイス」を介した通信と「コンテナ」によるライフサイクル管理である。

—

2. 実践:DIを活用した画面遷移アーキテクチャ

ここでは、画面間の「状態保持」と「遷移」を分離する。

ステップ1:インターフェイスの定義

まず、画面間で受け渡したい「データ」を契約(Interface)として定義する。

‘ 画面間で共有する状態を定義したインターフェイス
Public Interface IOrderContext
Property OrderId As Integer
Property CustomerName As String
End Interface

‘ 実装クラス:メモリ上に状態を保持する
Public Class OrderContext
Implements IOrderContext
Public Property OrderId As Integer Implements IOrderContext.OrderId
Public Property CustomerName As String Implements IOrderContext.CustomerName
End Class

ステップ2:コンストラクタ注入による密結合の排除

`Form2` は `Form1` を知らない。ただ「`IOrderContext` を持っている」ことだけを知っていればいい。

‘ Form2の設計:親画面を知る必要はない
Public Class Form2
Private ReadOnly _context As IOrderContext

‘ コンストラクタでインターフェイスを受け取る(依存性の注入)
Public Sub New(context As IOrderContext)
InitializeComponent()
_context = context
End Sub

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
‘ 注入されたデータを使ってUIを構築
Me.LabelStatus.Text = $”処理中: {_context.OrderId} – {_context.CustomerName}”
End Sub
End Class

—

3. アプリケーションのエントリポイントで制御する

DIコンテナ(あるいはシンプルなファクトリ)を利用し、アプリケーション全体のライフサイクルを制御する。これにより、メモリ管理を一元化できる。

‘ メイン制御クラス(画面遷移のハブ)
Public Class NavigationService
Private ReadOnly _context As IOrderContext = New OrderContext()

Public Sub ShowForm2()
‘ Form2にコンテキストを渡して生成
Using f2 As New Form2(_context)
f2.ShowDialog()
End Using
‘ Using句で抜けることで、確実にDisposeされる(メモリリーク防止)
End Sub
End Class

—

4. 業務アプリ開発における「鉄の掟」

1. Shared(静的)変数は追放せよ:
`Public Shared` は「グローバル変数」と同じだ。プログラムの規模が大きくなった瞬間、バグの温床となる。すべてのデータはインスタンスを介して受け渡せ。
2. `ShowDialog` を積極的に活用せよ:
モードレス(`Show`)は制御が難しい。業務アプリの基本はモーダル(`ShowDialog`)だ。処理の完了を待機し、確実に閉じる。これでメモリ管理の不確実性が劇的に下がる。
3. ファイル・DB連携は「サービス層」へ:
ボタンクリックのイベントハンドラに直接 `SQLConnection` を書くな。データアクセス層(DAL)を切り出し、画面は「データの表示」にのみ集中させる。

—

結論:コードは「書く」のではなく「設計する」もの

VB.NETは古い言語だと言われることもある。だが、その「古さ」ゆえに、こうしたオブジェクト指向の基本を徹底することで、現代的なモダン言語にも負けない堅牢なアプリケーションが構築できる。

今回の設計の肝は「Form同士を会話させない」ことにある。
画面遷移のたびに親画面と子画面が握手をするようなコードはやめよう。インターフェイスという名の「契約書」を介して、静かに、スマートにデータを渡す。

これができれば、君の作る業務ツールは、明日から「ゴミ」ではなく「資産」に変わるはずだ。

さあ、エディタを開き、そのスパゲッティを解きほぐすことから始めてくれ。健闘を祈る。

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