ai-driven-development legacy-migration blazor

WinForms のイベントを Blazor へ写経しないで「翻訳」する

`btn_Clear_Click` のような WinForms イベントをそのまま Blazor のメソッドに書き写すと、責務分割もタイミングもズレて事故ります。操作シナリオ単位で対応づけ直すと、移行品質がだいぶ安定しました。

W
渡邊 賢

なぜ書いたか

WinFormsのコードをBlazorに移すとき、btn_Clear_Click, btn_Set_Click, btn_Delete_Click のようなイベントハンドラを、そのままBlazor側のメソッドにコピーしたくなります。が、これをやると 責務もタイミングも合わない実装 が量産されます。今回は、写経ではなく翻訳するためのコツの話です。

なぜ写経するとダメか

WinFormsとBlazorでは、ボタンクリック前後の世界が違います。

  • WinForms: フォーカス遷移時に値が確定 → クリック時には値が入っているはず
  • Blazor: バインディングのタイミング次第。クリック時に最新値が入っているとは限らない(Tab/blur依存の罠 参照)

なので、WinFormsの「クリックハンドラの中で値を読む」前提をBlazorにそのまま持ち込むと、空値・古い値でAPIを呼ぶ事故が出ます。

やったこと

「イベント単位」ではなく「操作シナリオ単位」で対応表を作るようにしました。

操作シナリオWinForms 側Blazor 側
入力欄のクリアbtn_Clear_ClickOnClear() + 入力モデルのリセット
検索条件の確定と検索実行btn_Set_Clickクリック時に DOM 値を読み直してから検索
行の削除btn_Delete_ClickUI/API 両側で権限チェック → API コール

ハンドラ名を移すのが目的じゃなくて、「ユーザーから見た操作の流れ」を移す のが目的、という捉え直しです。

具体的な手順

  1. WinForms側のイベントハンドラを抜き出す(*_Click 系)
  2. それぞれを「ユーザー操作の言葉」に変換する(「設定する」「削除する」「クリアする」)
  3. 操作の流れに沿ってBlazor側のメソッド責務を再配置する。1:1マッピングは諦める
  4. UI側だけでなく、SQL / API呼び出しまで含めて差分が出ないか比較する

わかったこと

  • イベントハンドラを1:1で写経するのは、見た目は楽でも 挙動が合わない実装になりがち
  • 「翻訳」の単位は「操作シナリオ」。ユーザーから見た一連の操作を、新しいフレームワークでどう実現するかを考え直す
  • AIに「同じイベント名で書いて」と頼むと、写経モードに入りがちなので、最初に シナリオ表を渡す のが効きました

次にやること / 未解決の問題

  • シナリオ対応表のフォーマットが手作業で書かれていて、画面によって粒度が揃わない。テンプレート化したい
  • イベントタイミング差分(クリック直前のバインディング確定など)はまだケースバイケースで対処している。共通のFormコンポーネントに寄せられないか検討中
person

渡邊 賢

等差級数的Commit 運営 / ICD VIETNAM.LLC General Manager

AI駆動開発と段階的なレガシーモダン化をテーマに、日々の試行錯誤をこのブログに記録しています。

プロフィール詳細 arrow_forward

似たような課題に困っている方、一緒に考えませんか。

AI駆動開発・Vibe Coding・レガシーマイグレーションに関するご相談を受け付けています。