私はプログラミングのスキルをアップシャープにしようとしていると私はおそらく最良の例で説明するイライラ問題、出くわしました:シングルトンとサービスロケータの本当の代替品ですか?
だが、私はPHPでのMicroCMSを作成していましょう。このmicroCMSにはルーティングを担当するRouterクラスがあります。また、そこから抽出されたURIと追加のパラメータも保持します。
class Router{
private $uri;
private $params;
...
public function getRoute(){ ... }
...
public function getParams(){
return $this->params;
}
...
}
私は新しいコントローラのRouter()オブジェクトも渡しています。これまでのところ、私はフロントコントローラー($router->getParams();
経由)の余分なパラメーターにアクセスできます。
class FrontController{
private $controller;
private $view;
public function __construct(Router $router){
$route = $router->getRoute();
...
$params = $router->getParams(); //Yay, I can get to the params here!
...
$this->view = new View($route->getModel());
...
}
ここで私は複雑になります。このフロントコントローラーは、ビューを構成します。私はこのビューがルータの機能(例えば、そこからURIパラメータを得ることができるように)にアクセスできるようにしたいと思います。
class View{
public function output(){
//But how do I access the Router's params here...?
}
}
まず、最も簡単な解決策は、シングルトンにルーターを作るか、単に関数は静的にし、単にRouter::getParams()
を呼び出すことのようです...しかし、アンチパターンので、それはノーです。
2番目の明らかな解決策は、ルータのインスタンスをViewのコンストラクタに渡すことです。私は、私のコンストラクタがどこかに巨大になってしまうことを恐れて、これを避けたい。私はこのようにビューからアクセスする必要がある他のクラスがどれくらいあるのかよく分からず、コンストラクタを不必要に混乱させたくありません。この恐怖は正当化されていますか?
別の解決策は、サービスロケータを使用し、$serviceLocator->getRouter()
のようなものを私のビューで呼び出すことです。しかし、それは明らかに、アンチパターンです。
解決策は何ですか?それとも、私のCMSのアーキテクチャに根本的に間違っていることですか?
ルータ依存関係をいくつかのレベルのインスタンス化(最初にフロントコントローラに入れ、次にビューに入れ、次に誰かが知る必要がある場所を知っています...)が悪い習慣ではないと考えていますか? 私のクラスをサブクラスにリファクタリングする時が来たことはいつ知っていますか?依存関係があまりにも多いのはいつですか? –
実際にはありません。あなたは同じクラスを注射しているので、必要な時にはいつでも注射できます。私の経験則は、クラスがリファクタリングする必要がある700行を超える場合です。あまりにも多くの依存関係については...それはあなたがやっていることに依存します – Machavity