ai-driven-development legacy-migration blazor
「履歴モード」と「最新モード」を持つ画面の二重実装地獄
WinForms 系の業務画面でよくある「全件履歴」と「最新のみ」の切り替え。クエリだけでなく表示列・操作可否まで分岐するので、素直に作ると地獄を見ます。
W
渡邊 賢 なぜ書いたか
レガシー業務画面でよくある仕様に、「履歴表示モード」と「最新のみモード」の切り替えがあります。チェックボックス1つで挙動が変わるんですが、よく見るとクエリ・表示列・操作可否まで全部影響を受けます。Blazor移行でAIに「同じ画面を作って」と頼んだら、モード分岐の漏れが連発 したので、扱い方をまとめておきます。
何が変わるか
「履歴表示モード」がオンになると、私が踏んだ画面では以下が同時に変わりました。
- クエリ: 履歴含む全件取得 / 最新行のみ取得 でWHERE句が変わる
- 表示列: 履歴モードでのみ「世代番号」「履歴ステータス」列が出る
- 操作可否: 履歴モードでは「削除」「決定」などの破壊的操作が 禁止される
- 検索条件: 履歴モードでは特定のフィルターが意味を持たなくなる
特に厄介なのが3つ目です。「全受付モードのときだけ許可される操作」みたいな逆パターンもあって、UI側だけ見ても気づけません。
やったこと
3つに整理しました。
- モードフラグを単一ソースに寄せる: ページ上部の
IsHistoryModeのようなstateを1つ置き、すべての分岐がそれを参照する - 計算プロパティで派生状態を作る:
CanUseDelete,VisibleColumnsみたいな派生フラグをRazorの@codeブロックに集約。ボタン側はそれを見るだけ - クエリ側のモードも同じ名前で受け渡す: APIのDTOでも
Mode: history | latestのように明示的に渡す
派生状態を計算プロパティにまとめるのは、可視/活性制御の話とも被ります(WinFormsの可視/活性制御をBlazorで再現するコツ も合わせて読んでもらえると)。
わかったこと
- モード分岐は 1箇所でも漏れると業務が壊れる タイプのバグになります。最新のつもりで履歴データを更新する、履歴のつもりで決定を押す、など
- AIに画面を作らせるときは「モードという概念がある」ことを明示的に伝えないと、各分岐を別物として実装します。
IsHistoryModeのようなstate名と、それを参照すべき場所のリストを最初に渡すのが効きました - レビュー観点に「モード分岐は全部
IsHistoryModeを参照しているか」を固定で入れると、再発が止まります
次にやること / 未解決の問題
- モードを3つ以上持つ画面が今後出てきたとき、フラグの組み合わせが爆発するので、enum + 派生プロパティでまとめるパターンを試したい
- API側でもモードをenum化する必要がある。今は文字列で渡しているので、タイポで黙って間違ったモードになる事故リスクがある
person
渡邊 賢
等差級数的Commit 運営 / ICD VIETNAM.LLC General Manager
AI駆動開発と段階的なレガシーモダン化をテーマに、日々の試行錯誤をこのブログに記録しています。
プロフィール詳細 arrow_forward似たような課題に困っている方、一緒に考えませんか。
AI駆動開発・Vibe Coding・レガシーマイグレーションに関するご相談を受け付けています。