Problem具体的
我有一个对象 A(实体),它操纵一些公司(实体),
公司可以链接在一起(如果它们有共同股东)
例如)。我希望 A 能够知道公司 C1 是否是
与公司 C2 关联。
Feelings
根据我的知识和习惯,我认为公司实体中应该有一种方法来判断它是否与另一个实体有联系(point 1)。当然,我可以通过获取所有公司连接来做到这一点,并查看我的公司 C2 是否在其中(point 2)。但这很脏,这意味着出于什么原因获取所有依赖项?获得一个可以轻松从数据库中检索的布尔值,我可以考虑在与公司链接的存储库中创建一个函数(point 3)。但不行,因为实体(A 或 C1 和 C2)中没有任何可用的东西,轻量级对象会记住。
论证
- 第 1 点基于单一职责原则。请随意批评这一点。由于实体应该嵌入模型逻辑,我认为 isConnectedWith 函数应该在 CompanyEntity 的定义中正确。请记住这里 A 也是一个实体(所以这里也是存储库)
- 第 2 点是一个解决方案,从某种意义上来说它很好:这是正确的方法,如果,这是一个很大的如果,教义只是模拟的是真实的;如果只是打电话
$object->connexions
访问内存中某处已经存在的一些对象集合。但事实是可怕的:它不在那里,它存在于我们的 web 应用程序的常见瓶颈:数据库。
- 第 3 点 我厌倦了数据映射器和依赖注入组合告诉你的实体(和一些存储库)应该只靠自己生存,因为它们是模型逻辑。也许我的理解是非常错误的,但由于每个人都说这是一件坏事,所以我完全放弃了在实体中注入助手或配置的想法。
问题
您将如何解决保持完整性和性能并避免肮脏的解决方法的问题?我的论证中哪些观点是不好的?
我们来分析一下你的观点
Point 3
第3点根本不是解决方案!谁告诉你注入的差不多把一切都变成实体并不是一个好的解决方案,但却是绝对正确的。这几乎是面向对象和模式编程最佳实践的“事实上的标准”。
实体在那里only代表一个“对象”(当然,这不是 IT 接受的范围!),因此,属性和访问器方法是您必须包含的唯一内容。
考虑一下这样一种情况,您注入的东西可能会随着时间而变化(方法签名、方法返回类型或逻辑):在这种情况下,您必须更改实体本身以保持事物协同工作,但为什么您必须这样做实体,没有改变吗?深入思考它,因为这是 OO 编程的一个很好的起点(不仅仅是 symfony2 或实体表示!)
Point 2
是的,你是对的:为什么要从数据库中获取所有实体,或者如果你编写了一个“好的”查询,只获取你正在搜索的实体(如果你永远不会使用它)?
关于这一点,你必须分析如下:
- 我是否必须在其他地方使用这个(或那些)实体,所以获取它可能会很好?
- 我是否知道 Doctrine2 会在内存中保存他获取对象(*)的位置?这意味着,当您查询(或询问)先前获取的同一对象时,他会向您返回该对象的相同实例吗?因此,没有数据库连接,没有 fecth,没有重量级操作。
Point 1
是的,这是一个好点。您必须实现(当然是在存储库中!)类似的方法->isThere()
或者更好的东西(这是我想到的第一个名字)。
使用此方法,您可以编写自定义 SQL(称为DQL,其中D代表 Doctrine),您仅返回一个标志或一个整数(通过以下方式获得)COUNT(*)
或类似的聚合函数)。
对于获取不是ArrayCollection
实体但标量结果,顾名思义,使用$query->getSingleScalarResult();
我想我会倾向于最后一个解决方案。
希望已经解释清楚了
(*) 这就是所谓的恒等映射 http://docs.doctrine-project.org/en/latest/reference/working-with-objects.html#entities-and-the-identity-map
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)