ai-driven-development legacy-migration blazor

「履歴モード」と「最新モード」を持つ画面の二重実装地獄

WinForms 系の業務画面でよくある「全件履歴」と「最新のみ」の切り替え。クエリだけでなく表示列・操作可否まで分岐するので、素直に作ると地獄を見ます。

W
渡邊 賢

なぜ書いたか

レガシー業務画面でよくある仕様に、「履歴表示モード」と「最新のみモード」の切り替えがあります。チェックボックス1つで挙動が変わるんですが、よく見るとクエリ・表示列・操作可否まで全部影響を受けます。Blazor移行でAIに「同じ画面を作って」と頼んだら、モード分岐の漏れが連発 したので、扱い方をまとめておきます。

何が変わるか

「履歴表示モード」がオンになると、私が踏んだ画面では以下が同時に変わりました。

  • クエリ: 履歴含む全件取得 / 最新行のみ取得 でWHERE句が変わる
  • 表示列: 履歴モードでのみ「世代番号」「履歴ステータス」列が出る
  • 操作可否: 履歴モードでは「削除」「決定」などの破壊的操作が 禁止される
  • 検索条件: 履歴モードでは特定のフィルターが意味を持たなくなる

特に厄介なのが3つ目です。「全受付モードのときだけ許可される操作」みたいな逆パターンもあって、UI側だけ見ても気づけません。

やったこと

3つに整理しました。

  1. モードフラグを単一ソースに寄せる: ページ上部の IsHistoryMode のようなstateを1つ置き、すべての分岐がそれを参照する
  2. 計算プロパティで派生状態を作る: CanUseDelete, VisibleColumns みたいな派生フラグをRazorの @code ブロックに集約。ボタン側はそれを見るだけ
  3. クエリ側のモードも同じ名前で受け渡す: 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・レガシーマイグレーションに関するご相談を受け付けています。