1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

複雑なドリルダウンを「If文」で書くのはもうやめよう:フォーム設計を「グラフ理論」で解き明かす

1
Posted at

はじめに

Webアプリケーション開発において、入力フォームは最も基本的で、かつ最もスパゲッティコードが生まれやすい場所です。
特に、前の回答によって次の設問がダイナミックに変化する「ドリルダウン(動的な条件分岐)」を実装しようとすると、フロントエンドのロジックは if 文の迷宮と化します。

「Q1がAで、かつQ2がBなら、この設問を表示し、かつ必須にする」

こうしたロジックを命令的に書き連ねるのではなく、コンピュータサイエンスの古典的な知恵である「グラフ理論」「宣言的UI」の視点から整理すると、驚くほどスッキリとした設計が見えてきます。


1. フォームは「有向非巡回グラフ(DAG)」である

ドリルダウンが複雑になったフォームは、単なる設問の羅列ではありません。それは、数学における有向グラフ(Directed Graph)そのものです。

  • ノード(点):各設問(Q1, Q2, Q3...)
  • エッジ(線):設問間の依存関係(「Q1の回答がQ4の表示に影響する」という矢印)

ここで重要なのが、このグラフがDAG(Directed Acyclic Graph:有向非巡回グラフ)でなければならないという点です。もし「Q1がQ2に依存し、Q2がQ1に依存する」という循環参照(Cycle)が発生すると、システムは無限ループに陥り、計算順序を決定できなくなります。

システムはこのグラフを解析し、トポロジカルソート(Topological Sort)というアルゴリズムを用いて、「どの順番で設問を評価・表示すべきか」を自動的に導き出します。私たちが「ドリルダウン」と呼んでいるものは、実のところグラフの依存関係の解消プロセスなのです。

2. 確立された手法:「宣言的」なメタデータ定義

では、このグラフ構造をどうデータとして保持すべきか。歴史的に導き出された「正解」の一つは、「If文を書かずに、制約(Constraint)を記述する」というアプローチです。

以下のように、設問自体に「自分がどういう条件下で有効か」というメタデータを持たせます。

{
  "id": "Q4_coupon",
  "title": "限定クーポンをご利用になりますか?",
  "visibleIf": "{Q1_first_time} == 'いいえ' && {Q2_satisfaction} >= 4 && {Q3_count} >= 10",
  "isRequired": true
}

この設計思想には、20年以上にわたるアカデミックな積み重ねがあります。

W3C XForms (2003〜)

2000年代初頭、W3CはWebフォームの標準規格としてXFormsを提唱しました。ここで確立されたのが、UIとロジックを分離し、設問の属性として relevant(表示条件)や required(必須条件)を定義するという手法です。
「特定の条件下でのみ設問が有効になる」というロジックにXPathなどの評価式を用いる考え方は、現在のモダンなフォーム設計の原点と言えます。

CDISC ODM (臨床試験データ標準)

データの厳格な整合性が求められる治験・医療分野では、CDISC ODMという規格が世界標準となっています。ここでは設問間の依存関係(Skip Logic)を FormalExpression というメタデータで記述します。
これは「データの信頼性を守るためには、表示ロジックがコードではなく、データ(スキーマ)の一部として定義されていなければならない」という学術的な要件に基づいています。

現代のデファクト:SurveyJS や Form.io

現在、多くのエンタープライズ製品で採用されているフォーム基盤も、この系譜を受け継いでいます。プログラミング言語による命令的な記述を廃し、JSONベースの評価式によってドリルダウンを制御する手法が、最もメンテナンス性の高いデファクトスタンダードとして定着しています。

3. なぜ「If文」ではなく「プロパティ」なのか

プログラムの中に if (Q1 == 'A') { show Q2 } と書く(命令的)のと、Q2に属性として visibleIf: Q1 == 'A' と書く(宣言的)のとでは、設計の堅牢性に天と地の差が出ます。

  • 自己記述性(Self-Descriptive):設問項目を見ただけで、その出現条件という「制約」が完結しています。
  • リアクティブ・エンジンの実装
    「依存関係グラフ」を内部に持っていれば、Q1が変わった瞬間に、下流にあるすべての評価式を自動で再計算する「エクセルの再計算」のような挙動を簡単に実装できます。
  • スキーマの進化(Schema Evolution)への対応
    複雑に連結されたグラフにおいて、ある項目のIDや選択肢を変更することは、ノードの破壊を意味します。
    ※ここでバージョン管理を怠ると、過去の回答データが「変更後の新しいグラフ」で正しく評価できなくなるという致命的な不整合を招くため、スキーマの世代管理もセットで考えるのが定石です。

まとめ

複雑なドリルダウンの実装に直面したとき、それは単なるUIの実装である以上に、「データ間の依存関係をどうモデリングするか」というグラフ理論の課題です。
先人たちが XFormsCDISC ODM で築いてきた「宣言的に制約を記述する」という知恵を借りることで、私たちは複雑な要件に対しても、堅牢で美しいシステムを提供できるようになります。
次にフォームを作るときは、一度手を止めて、その裏側に隠れた「依存の地図」を一本引いてみてはいかがでしょうか。

参考キーワード

  • DAG (Directed Acyclic Graph)
  • Topological Sort
  • W3C XForms / CDISC ODM
  • Constraint Satisfaction Problem (制約充足問題)
  • Schema Evolution
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?