モノリシックコアとマイクロコア
現在はパス名解決のために、全てPathUtilsクラスを通している。
このクラスに処理を追加するだけで、理想の動作(URLとディレクトリ構造の分離)を実現できるのではないだろうか。
しかし今は単純なユーティリティクラスなのでスタティック呼び出しで使っている。
パス名の設定を読み込むとなると・・DIコンテナに扱わせると楽だがそれはやりたくない。
DIコンテナをコアで使うということは、カーネルでいうとマイクロカーネル的な考え方だ。
論理的に綺麗だけど全体の動作が掴みにくいマイクロカーネルより、シンプルで単純なモノリシックカーネルの方が扱いやすい。
だからわざわざコアクラスをコンテナ管理していたコードを書き直した。
しかしスタティックな関数群を集めたクラスになると、DIコンテナが設定ファイルから自動的に初期動作を決定するようなことができない。
・・・と思っていたけど少々妥協することによって可能な気がする。
C++だと
// hoge.h class Hoge { private: static Hoge *instance; } // hoge.cpp Hoge *Hoge::instance = NULL;
のように初期化できる。
PHPはそういう書き方はできないが
<?php class AnyUtils { static private $initialized; static public initOnce(){ if (self::$initialized) return; // 初期化処理 ... self::$initialized = true; } } AnyUtils::initOnce();
というようにDIコンテナの初期化処理の代わりができるのではないか。
ここまでDIコンテナを使わないことに拘らなくてもいいのかもしれないが、コアを動的に入れ替える必要が本当に出てくるまで不要な複雑さを持ち込みたくない。
この方法だと全体の流れを見るときにファイルをあちこち飛び回らなくていいし、設定を自分で管理できるのでコンストラクタのオプションで設定を指定してsingletonで持ち回らなくてもよくなる。
汎用性は無くなるが、そもそもコンテナを使わなくてもパスによってクラス自体を入れ替えることができるのだ。だからコンテナはビジネスロジックで利用するオブジェクトだけ登録しても問題ない。
・・・という方式で修正してみる。