错误的 OO 架构、共享对象和依赖项?也许我在这里缺少设计模式


Wrong OO architecture, sharing objects and dependencies? Maybe i'm missing a design pattern here?

好的,我正在创建一个小型PHP应用程序。当前的结构是这样的:

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

这里的一切都很美。客户端负责通过 Socket 将命令连接并运行到我构建的小型 C 应用程序。我只是在这里玩建筑。Client::getModel 返回 Model 的一个实例。在getModel期间,我通过构造函数将客户端注入模型内部。像这样:

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

反过来...

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

但是,在 Model::getNode 期间,我想返回 Node 的一个实例。但是,与getModel不同,我不想再次注入客户端。但我必须这样做。现在,我正在这样做:

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

我确定这是不正确的。一定是我错过了什么...我理解并使用依赖注入,但我很确定依赖注入容器不会解决我的问题。

我真的不能说出你的整个设计,因为你没有发布大部分内容,但我认为你缺少一个模式。 核心 OO 设计原则之一是,您不会向对象请求数据/对象,然后对该数据/对象进行操作,而是要求对象为您做某事 - 也许该部分只是为了简洁而编辑的,但您可能需要考虑少做"获取"。

为了在我自己的设计中强制这样做,我从不在第一次传递时创建二传手和二传手(好吧,我几乎从不创建二传手)。 稍后,只有在我无法避免它们时才会进入并添加 getter(我认为您仍然经常需要它们......

另一件事是完全避免继承,直到你绝对是解决问题的唯一方法,而不会重复代码或使事情变得混乱。 问题是,这个问题不是用我的母语编码的,所以我真的不知道你在做什么。

看起来你忘记将客户端存储在setClient()中的模型中,或者你没有从getClient()返回它

如果您发布 setClient() 和 getClient() 的代码,我可以验证这一点。

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

获得客户端不是模型的工作(反之亦然!那是工厂的问题!您的方法应如下所示:

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

切勿将工厂逻辑与业务逻辑混合使用,因为这会使测试变得不可能。