ScanDataNet(Rust 版 scandata)では ValueObject を関数型プログラミング (FP) で書き直す方針が決まっています。 そのために Rust が提供する 3 つの強力な道具
im クレートで非破壊コレクション)を、Rust 初心者でも追えるレベルで図と例を交えて解説します。
| 項目 | 必須レベル | 不足していたら |
|---|---|---|
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 |
ScanDataPy(現行 Python 版)のコードベース調査で判明している主な痛みは以下です:
| 痛み | 具体例 | FP で消える理由 |
|---|---|---|
| 状態の取り違え | Dark frame 減算前に dF/F を計算してしまう | Phantom Type で順序を型強制 |
| 識別子の混同 | get_frames(2, 100, 1) の引数順序ミス |
Newtype で Channel と FrameIndex を別型に |
| mutate の連鎖 | TagMaker.set_data が ValueObject を破壊的更新 |
永続データ構造 + &T -> T シグネチャ |
| undo・履歴の欠如 | Repository の状態は常に最新のみ | 永続データ構造 で過去の世代も保持可能 |
| テスト容易性の欠如 | Model 層が pyqtgraph を import、Qt なしでテスト不能 | 純粋関数化で副作用を Adapter 層に押し出し |
詳細は同フォルダの oo_vs_fp_state.html も参照してください。
FramesData<Raw> と FramesData<DarkSubtracted> を別の型として扱い、
Modifier の適用順序をコンパイラに守らせる仕組み。
FPPhase L2 で導入
u8 ではなく Channel(u8)、String ではなく Filename(String)。
たった 1 行で意味の取り違えを撲滅する Rust の鉄板パターン。
FPPhase L1 から導入可
im クレートによる永続データ構造
HashMap。
Repository を関数型で書き直すと undo / タイムトラベルデバッグが無料で手に入る。
FPPhase L2 で導入
im を組み合わせた ValueObject + Repository の完成コード。
アーキテクチャ図とデータフロー、学習ロードマップ込み。
FPPhase L2 設計の青写真
rustlings と並行して、自分の手で 50 行程度のサンプルを書いてみるscandata-io 着手前に §2(Newtype)だけは確実に身につけておく同一フォルダ内の HTML 学習ノート(クリックで開く):
oo_vs_fp_state.html — OO の mutate と FP の不変 struct を対比fileio_oo_to_fp.html — FileIO 層の OO → FP 設計移行project_layout.html — scandataNet のプロジェクト構成図rust-pub-keyword.html — Rust の pub キーワード:可視性修飾子の完全ガイドderive-macro.html — Rust の #[derive] マクロ:トレイト自動実装の完全ガイド(展開図・依存関係・scandata 応用)rust-option.html — Rust の Option<T>:null なしで「値があるかもしれない」を型で表す。elec: Option<ElecData> の設計根拠
外部参照(scandataNet プロジェクト側に存在する Markdown ドキュメント。本サイトには未収録):
FUNCTIONAL_PROGRAMMING_GUIDELINES.md、
PHASE_L1_TSM_PARSER.md、
LEARNING_WEB_PROJECT_PLAN.md、
IMPROVEMENT_PLAN.md