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_Click | OnClear() + 入力モデルのリセット |
| 検索条件の確定と検索実行 | btn_Set_Click | クリック時に DOM 値を読み直してから検索 |
| 行の削除 | btn_Delete_Click | UI/API 両側で権限チェック → API コール |
ハンドラ名を移すのが目的じゃなくて、「ユーザーから見た操作の流れ」を移す のが目的、という捉え直しです。
具体的な手順
- WinForms側のイベントハンドラを抜き出す(
*_Click系) - それぞれを「ユーザー操作の言葉」に変換する(「設定する」「削除する」「クリアする」)
- 操作の流れに沿ってBlazor側のメソッド責務を再配置する。1:1マッピングは諦める
- UI側だけでなく、SQL / API呼び出しまで含めて差分が出ないか比較する
わかったこと
- イベントハンドラを1:1で写経するのは、見た目は楽でも 挙動が合わない実装になりがち
- 「翻訳」の単位は「操作シナリオ」。ユーザーから見た一連の操作を、新しいフレームワークでどう実現するかを考え直す
- AIに「同じイベント名で書いて」と頼むと、写経モードに入りがちなので、最初に シナリオ表を渡す のが効きました
次にやること / 未解決の問題
- シナリオ対応表のフォーマットが手作業で書かれていて、画面によって粒度が揃わない。テンプレート化したい
- イベントタイミング差分(クリック直前のバインディング確定など)はまだケースバイケースで対処している。共通のFormコンポーネントに寄せられないか検討中
person
渡邊 賢
等差級数的Commit 運営 / ICD VIETNAM.LLC General Manager
AI駆動開発と段階的なレガシーモダン化をテーマに、日々の試行錯誤をこのブログに記録しています。
プロフィール詳細 arrow_forward似たような課題に困っている方、一緒に考えませんか。
AI駆動開発・Vibe Coding・レガシーマイグレーションに関するご相談を受け付けています。