3

OK、私は小さな PHP アプリケーションを作成しています。現在の構造は次のようなものです。

$client = new AppName\Client;
$model = $client->getModel();
$model->getNode();

ここではすべてが美しいです。クライアントは、ソケットを介して、私が構築した小さな C アプリケーションに接続してコマンドを実行する責任があります。ここでは建築で遊んでいるだけです。Client::getModel は Model のインスタンスを返します。getModel 中に、コンストラクターを介して Model 内に Client を挿入します。このようなもの:

public function getModel()
{
    return new Model('parameter', $this);
}

どちらが...

// Model
public function __construct($param, Client $client)
{
    $this->setClient($client);
    // ...
}

ただし、Model::getNode の実行中は、Node のインスタンスを返したいと考えています。ただし、getModel とは異なり、Client を再度注入する必要はありません。しかし私はしなければなりません。今、私はこれをやっています:

public function getNode()
{
    return new Node('parameter', $this->getClient());
}

これは正しくないと確信しています。何か足りないものがあるに違いありません...依存性注入を理解して使用していますが、依存性注入コンテナーでは問題が解決しないと確信しています。

4

3 に答える 3

0

あなたがほとんど投稿していなかったので、私はあなたのデザイン全体を実際に話すことはできませんが、あなたが欠けているパターンがあると思います。OOのコア設計原則の1つは、オブジェクトにデータ/オブジェクトを要求せずに、そのデータ/オブジェクトを操作し、オブジェクトに何かを実行するように要求することです。おそらく、その部分は簡潔にするために編集されただけですが、 「取得」を減らすことを検討することをお勧めします。

これを自分のデザインで強制するために、最初のパスでセッターとゲッターを作成することは決してありません(まあ、セッターを作成することはほとんどありません)。後で、ゲッターを避けられない場合にのみ、ゲッターを追加します(それでも、ゲッターはかなり頻繁に必要になると思います...)

もう1つのことは、コードを複製したり混乱させたりせずに問題を解決する唯一の方法であるまで、継承を完全に回避することです。問題は、質問が私の母国語でコード化されていないので、あなたが何をしているのか本当にわからないということです。

于 2012-05-12T04:30:11.667 に答える
0

クライアントを取得するのはモデルの仕事ではありません(またはその逆です!)。それが工場の問題です!メソッドは次のようになります。

$client = new AppName\Client($model);

テストが不可能になるため、ファクトリロジックとビジネスロジックを混在させないでください。

于 2012-05-12T19:18:40.080 に答える
0

setClient() 内のモデルにクライアントを格納するのを忘れたか、getClient() から返されていないようです。

setClient() と getClient() のコードを投稿していただければ、それを確認できます。

setClient($client){
    $this->client = $client;
}

getClient(){
    return $this->client;
}
于 2012-05-12T04:02:50.270 に答える