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

时间:2012-05-12 03:48:54

标签: php oop design-patterns

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

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

这里的一切都很美好。客户端负责通过Socket连接和运行命令到我构建的小型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不同,我不想再次注入客户端。但我不得不。现在,我这样做:

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

我确定这不对。必须有一些我缺少的东西...我理解并使用依赖注入,但我很确定依赖注入容器不会解决我的问题。

3 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

我无法真正对你的整个设计说话,因为你没有发布大部分内容,但我认为你缺少一种模式。其中一个核心OO设计原则是你不要求对象获取数据/对象,然后对该数据/对象进行操作,你要求一个对象为你做点什么 - 也许这部分只是为了简洁而编辑,但是你可能想考虑少做“获取”。

为了在我自己的设计中强制执行此操作,我绝不会在第一次通过时创建setter和getter(好吧,我几乎从不创建setter)。之后我会进入并添加吸气剂,只有当我无法避免它们时(我仍然经常需要它们......)

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

答案 2 :(得分:0)

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

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

您不应该将工厂逻辑与业务逻辑混合在一起,因为它使测试变得不可能。