ORM会导致错误的编码实践吗?

时间:2013-03-11 00:50:45

标签: php orm coding-style doctrine

我们在团队中使用PHP中的ORM,并且我在两个单独的项目中注意到,尽管我们已经详细讨论了良好的MVC设计,但ORM似乎允许人们进行数据库查询从View层创建难以维护的代码。

我倾向于认为ORM太容易在程序员不考虑的掩护下进行查询。通过将ORM对象返回到视图层,程序员实际上是将数据库连接泄漏到不应该拥有它的层。

我在这里正确地考虑ORM吗?如果是这样,为什么它如此受欢迎?如果我没有正确地考虑应该如何我解决这些问题?

3 个答案:

答案 0 :(得分:5)

我会说你没有正确地思考它。 ORM本身并不会促进不良行为,至少不会影响您的体验。

ORM是一个工具,就像任何其他框架,api或其他任何东西一样,你可以正确使用它。

听起来更像问题是团队中的开发人员对MVC模式没有清楚的了解。我首先要解决这个问题。

我认为MVC模式的一个常见问题是开发人员倾向于将视图和控制器用于他们不应该做的事情。原因可能很多,但每当你使用这样的东西时,我都会认为问题通常都是从这个想法开始的:

  

“这是一个简单的小事我会在这里做,而不是   没有必要在那里做到这一点。“

基本上,当尝试解耦设计和业务逻辑时,总会出现这样的情况,即实现某个实际属于表示层业务层的部分更容易。这绝不意味着开发人员不好,但可能会显示缺乏经验或懒惰。我知道我已经多次犯过这个问题了,比如在为Android开发时(从不专业但是:))。

如何尝试找出一些样本案例,它使用了一些你已经注意到的错误做法,并且有一些编码-dojo,你作为一个团队使代码很好并且正确实现,如果你有时间,显示他们所属的东西的实际好处。我强烈建议不要使用实际的代码,除非你自己编写代码,否则负责代码的开发人员可以在其他开发人员面前被破坏。但这显然取决于贵公司的文化,以及开发人员是否对此类事情感兴趣并开放。我个人很想在我的工作场所做类似的事情。

答案 1 :(得分:2)

我不知道在视图层中进行小型ORM调用必然坏。例如,我可能会将foreach (Category::getAll() as $Category):作为循环来列出页面上的类别。连接不会泄漏到视图的范围内(或者它当然不应该泄漏),因为它是由ORM封装的。我可以在控制器中分配这个调用的结果,并将对象数组传递给模板(我肯定会使用更复杂的调用)但是在视图中很简单的情况很好。

根据我的经验,ORM的最大问题是“n + 1”数据库查询计数的增长。通常,一个:屏幕上的许多列表可以从单个查询中呈现,但是ORM使得使用具有一个表的主循环非常方便,然后对次表的每个实例进行单独选择。这是低效的,但是你只会注意到你的数据库开始崩溃时,它必须处理的查询数量增加。

最好的防范是要求开发人员以开发模式运行工具栏(例如Symfony2工具栏,PHP Debug或类似工具),向他们展示构建屏幕所需的查询数。当琐碎的屏幕开始需要超过50个查询(或您指定的任何上限)时,他们需要重构。

此外,值得选择具有合理表达查询语法的ORM,否则您的开发人员将回避“原始SQL”模式,这会破坏首先使用ORM的一些原因。出于同样的原因 - 丹尼尔很好地说明了这一点 - 为你的开发人员提供有效使用ORM的培训是一个好主意。

答案 2 :(得分:1)

从视图中进行查询是一种不好的做法。你可以做到这一点,但最好通过Ajax Requests或任何你认为合适的控制器来完成它。