コンテンツにスキップ

Chapter 5: using — 外部リソースとのライフサイクル同期

timelineフレームワークの根底には、物理学の「ブロック宇宙」モデルに基づいた、時間と共に変化する値を宣言的に扱うという思想があります。この考え方から自然と導き出されるのは、開発者がリソースの生成や破棄のタイミングを一切気にすることなく、本質的なロジックの記述に集中できる全自動リソース管理の実現です。

我々はこの理想を、リアクティブな内部状態だけでなく、Gnome Shell拡張のGTKウィジェットのような、あらゆる外部リソースのライフサイクルにまで適用する道筋を発見しました。これから解説する.using()は、その理想を完全に具現化する、このフレームワークの最終的な完成形です。

.using() API — 究極のリソース管理

Section titled “.using() API — 究極のリソース管理”

.bind()Timelineオブジェクトのライフサイクルを管理するのに対し、.using()は、「リソースの生存期間」を「Timelineのイリュージョン」と完全に同期させるための、唯一の正しいアプローチです。

F#: using: ('a -> Resource<'b>) -> Timeline<'a> -> Timeline<'b option>
Section titled “F#: using: ('a -> Resource<'b>) -> Timeline<'a> -> Timeline<'b option>”
TS: using<B>(resourceFactory: (value: A) => { resource: B; cleanup: () => void } | null): Timeline<B | null>
Section titled “TS: using<B>(resourceFactory: (value: A) => { resource: B; cleanup: () => void } | null): Timeline<B | null>”
  1. sourceTimelineの値が変化すると、usingはまず、以前のイリュージョンで生成されたリソースに紐づくcleanup関数を、disposeIllusionを通じて確実に実行します。
  2. 次に、新しい値でresourceFactory関数を呼び出します。
  3. resourceFactory{ resource, cleanup }オブジェクトを返した場合:
    • resourceが、出力Timelineの新しい値となります。
    • cleanup関数が、新しいイリュージョンに紐づくonDisposeコールバックとしてDependencyCoreに登録されます。
  4. resourceFactorynullを返した場合、出力Timelinenullとなり、クリーンアップ処理も登録されません。
  • 保証: このメカニズムにより、resourceFactoryによって一度でも生成されたリソースは、そのイリュージョンが(どのような理由であれ)終了する際に、対応するcleanup関数が必ず呼び出されることが保証されます。これにより、リソースリークは構造的に発生し得ません。

Illusion概念の拡張 — レベル3の可変性

Section titled “Illusion概念の拡張 — レベル3の可変性”

.using()の導入によって、Illusionの概念はさらに一段階拡張されます。

  • レベル1 (map): _lastというが可変。
  • レベル2 (bind): innerTimelineという内部構造が可変。
  • レベル3 (using): DOMやタイマーといった外部世界の存在そのものが、Illusionのライフサイクルと同期する可変な存在となる。

進化した心臓部: DependencyCoreonDispose

Section titled “進化した心臓部: DependencyCoreとonDispose”

DependencyCoreは、もはや単なる「リアクティブな接続」の管理システムではありません。それは、「依存関係の生存期間(ライフサイクル)に紐づく、あらゆる種類のクリーンアップ処理」を保証する、汎用的な基盤へと進化しました。

.using()は、resourceFactoryが返すcleanup関数を、このDependencyCoreonDisposeコールバック機能を通じて登録します。そして、Illusionが破棄される際に、DependencyCoreがこのonDispose(つまりcleanup)の実行を100%保証することで、外部リソースのクリーンアップが完全に自動化されるのです。

このTimelineは、もはや単なるFRPライブラリではありません。それは、宣言的なデータフローと、命令的なリソース管理という、しばしば対立するパラダイムを、 「ライフサイクル」 という単一の統一された概念の下に完全に統合した、新しい次元のフレームワークです。

デバッグ効率プロダクション環境でのパフォーマンスを両立させる設計により、このフレームワークは研究開発段階から実用段階まで、一貫して開発者を支援します。これは、理論的な美しさと実用的な価値を兼ね備えた、真に完成されたソフトウェアアーキテクチャの実現です。

image


image