Oop 什么时候应该将一个对象作为另一个对象的成员包含,什么时候应该始终独立?

Oop 什么时候应该将一个对象作为另一个对象的成员包含,什么时候应该始终独立?,oop,model-view-controller,class-design,composite,Oop,Model View Controller,Class Design,Composite,一个示例问题: 在堆栈溢出上,问题页面显示许多不同的答案。在显示这些答案时,该网站还提供了关于答案作者的信息。这意味着,尽管给定用户的徽章数量与答案本身无关,但仍需要检索该数据才能显示页面 从我看到的情况来看,有三种不同的方法可以在模型中提取此视图数据: Post对象可以包含完整的用户对象作为成员。然后,视图将按如下方式访问用户:$post->user->getReputation()。这看起来更干净,因为一个控制器可以只请求帖子并完成它,但是效率很低,因为帖子可能并不总是需要一个成熟的用户。我

一个示例问题:

在堆栈溢出上,问题页面显示许多不同的答案。在显示这些答案时,该网站还提供了关于答案作者的信息。这意味着,尽管给定用户的徽章数量与答案本身无关,但仍需要检索该数据才能显示页面

从我看到的情况来看,有三种不同的方法可以在模型中提取此视图数据:

  • Post对象可以包含完整的用户对象作为成员。然后,视图将按如下方式访问用户:
    $post->user->getReputation()
    。这看起来更干净,因为一个控制器可以只请求帖子并完成它,但是效率很低,因为帖子可能并不总是需要一个成熟的用户。我想,如果用户对象相对较轻,它的工作就足够好了,这很可能是正确的。问题是,您需要在检索后查询中复制用户检索代码

  • Post对象只能保存用户的ID。当Post返回给控制器时,控制器可以从返回的集合中提取唯一的用户ID,并将其传递给用户工厂。然后,返回的用户对象将与作为单独集合设置到视图的原始帖子一起传递。然后,视图可以使用类似于
    $users[$post->getUserId()]->getReputation()
    的方法获取用户信息

  • 混合方法:将用户对象包含在Post对象中,但将唯一id提取和用户检索作为Post检索方法的一部分。i、 e.
    Post::getPosts()
    将获取所有相关帖子并将其转换为具有空用户成员的对象,然后提取所有用户ID并将其传递给
    User::getUsers()
    ,然后将用户分配到相关帖子,然后将帖子集返回给调用者


  • 我想我的意思是,我如何知道一个对象何时需要包含另一个对象?取而代之的是将这些相关对象单独返回,而两个对象都不知道另一个对象已被检索,这是否不干净/有代码味道。我倾向于使用单独的检索概念,这似乎是最有效的,但我确实觉得它们之间的关联太大了,没有意义。

    在我看来,这是依赖注入的另一种情况。一个足够全面的想法可以帮助你


    阅读一些关于控制反转的内容。

    在1和2之间也有一个解决方案。用户类可以有一个延迟加载代理。使用此解决方案,您可以两全其美,因为代理可以与真实对象互换,因此根据情况,您可以使用对象本身或代理

    编辑: 我将试着用一个例子来解释这一点

    假设您有一个不需要用户信息的视图,那么您可以指示/配置post factory为用户使用惰性代理(),该代理只包含一个ID。因此不需要访问用户

    在另一个视图中,您偶尔需要访问用户信息,但仅限于某些帖子,这里再次指示/配置您的工厂以包含用户的惰性代理。 但是,当您实际需要访问用户信息时,您可以访问代理对象,然后代理对象将加载实际的用户对象并将消息重定向到它


    在另一个视图中,您需要post和用户信息,因此这里您指示您的post工厂使用实际的用户对象。

    为什么不向模型添加可选成员以了解信息??当你不需要的时候,你可以忽略,当你确实需要的时候,你可以使用。

    我真的很想知道为什么我被否决了。也许下次我不会再犯同样的错误了。谢谢我不太明白。你能详细说明一下吗?