FP で書き直す ValueObject 設計ガイド

Rust の Phantom Type / Newtype / 永続データ構造で、ScanDataPy の Python 設計を関数型に進化させる · 作成 2026-05-17

1. この資料群の目的

ScanDataNet(Rust 版 scandata)では ValueObject を関数型プログラミング (FP) で書き直す方針が決まっています。 そのために Rust が提供する 3 つの強力な道具

を、Rust 初心者でも追えるレベルで図と例を交えて解説します。

全体を読み終えると、ScanDataPy 現状の問題(順序ミス・識別子取り違え・mut の蔓延)が Rust の型システムでどう「コンパイル時に消える」かを理解でき、Phase L1 / L2 の設計判断に直接使える知識になります。

2. 前提知識

項目必須レベル不足していたら
Rust の基本構文(fn, struct, enum, impl 必須 The Rust Programming Language 1〜5 章
所有権と借用(&, &mut, ライフタイム入門) 必須 同書 4 章 + rustlings move_semantics
ジェネリクス(Vec<T> が読める) 必須 同書 10 章
trait と impl ブロック あると楽 同書 10.2 章
Result<T, E>? 演算子 あると楽 同書 9 章
ScanDataPy の Modifier チェーン概念 本プロジェクト特有 CLAUDE.md §1 / IMPROVEMENT_PLAN.md

3. なぜ FP に振り切るのか

ScanDataPy(現行 Python 版)のコードベース調査で判明している主な痛みは以下です:

痛み具体例FP で消える理由
状態の取り違え Dark frame 減算前に dF/F を計算してしまう Phantom Type で順序を型強制
識別子の混同 get_frames(2, 100, 1) の引数順序ミス NewtypeChannelFrameIndex を別型に
mutate の連鎖 TagMaker.set_data が ValueObject を破壊的更新 永続データ構造 + &T -> T シグネチャ
undo・履歴の欠如 Repository の状態は常に最新のみ 永続データ構造 で過去の世代も保持可能
テスト容易性の欠如 Model 層が pyqtgraph を import、Qt なしでテスト不能 純粋関数化で副作用を Adapter 層に押し出し

詳細は同フォルダの oo_vs_fp_state.html も参照してください。

4. ページ一覧

1 Phantom Type による状態の型表現
FramesData<Raw>FramesData<DarkSubtracted> を別の型として扱い、 Modifier の適用順序をコンパイラに守らせる仕組み。 FPPhase L2 で導入
2 Newtype による識別子の型安全性
u8 ではなく Channel(u8)String ではなく Filename(String)。 たった 1 行で意味の取り違えを撲滅する Rust の鉄板パターン。 FPPhase L1 から導入可
3 im クレートによる永続データ構造
変更しても元が壊れない・構造共有で軽い HashMap。 Repository を関数型で書き直すと undo / タイムトラベルデバッグが無料で手に入る。 FPPhase L2 で導入
4 3 つを統合した完成イメージ
Newtype + Phantom Type + im を組み合わせた ValueObject + Repository の完成コード。 アーキテクチャ図とデータフロー、学習ロードマップ込み。 FPPhase L2 設計の青写真

5. 学習の進め方推奨

  1. 1 ページ目から順に読む。各ページは独立して読めるが、§4 統合ページは §1〜§3 を前提にしている
  2. 各ページの末尾にある「学習ステップ」を実際に手を動かして試す
  3. rustlings と並行して、自分の手で 50 行程度のサンプルを書いてみる
  4. 詰まったら「落とし穴」セクションをチェック
  5. Phase L1 の scandata-io 着手前に §2(Newtype)だけは確実に身につけておく
所要時間目安: 各ページ通読 30〜45 分、手を動かす演習込みで 1 ページ 3〜5 時間。 4 ページ全体で 週末 2 回程度を想定。

6. 関連ドキュメント

同一フォルダ内の HTML 学習ノート(クリックで開く):

外部参照(scandataNet プロジェクト側に存在する Markdown ドキュメント。本サイトには未収録): FUNCTIONAL_PROGRAMMING_GUIDELINES.mdPHASE_L1_TSM_PARSER.mdLEARNING_WEB_PROJECT_PLAN.mdIMPROVEMENT_PLAN.md


次へ → 1. Phantom Type による状態の型表現