ComponentとIntegrantの違い
システムを構築するための設定をコード上に書く必要がある
詳しくは説明しないけど、いつか公開するかもしれない
すべてのコンポーネントはLifeCycleプロトコルを実装する
明示的に実装しない場合、Objectに対する実装が利用される
何かしらコンポーネントに依存する場合は以下の条件を満たすこと
それ自身もLifeCycleプロトコルを実装している
associativeであること
他のコンポーネントから依存されるだけの場合、これを満たす必要はない
任意のコンポーネントを差し替えたい場合は、単にsystem-mapの任意のキーに対応するコンポーネントを変更するだけでよい
システムを構築するための設定はednファイルに記述することができる すべてのコンポーネントはinit-keyとhalt-key!マルチメソッドにメソッドを追加することで、初期化処理と破棄する処理を決定することができる
またComponentと違いデフォルトでsuspend!とresumeが提供されており、より高速にシステムをリセットすることができるとしている 何かしらコンポーネントに依存したい場合は、init-keyにメソッドを追加する必要がある
任意のコンポーネントを差し替えたい場合、ふたつの選択肢がある
結局のところ大きな違いは以下の点であって、それ以外は些末な実装上の違いである。
table:differencies
Component Integnrat
何からシステムを構築するか プログラム 設定ファイル
何かに依存するコンポーネントは レコードやマップ 何でもよいl
羃等性を担保する上での面倒について
athosathos.iconさんから指摘を受けたので追記。 コンポーネントが別で作られた上で、システムに管理されるため、「そのコンポーネントが起動済みかどうか」はコンポーネント自身しか知ることができない
init-keyはコンポーネントの作成と初期化を同時にやってしまうため、「そのコンポーネントが起動済みかどうか」を気にする必要はない
起動されていればシステムの中に存在し、halt-key!に値が渡ってくれば初期化されていると判断できる
なのでComponentは羃等性を担保しようとするとボイラープレートが増えてしまい面倒だ、という話になる。