【问题标题】:Laravel - updateOrCreate method, isnt it programming principles breakingLaravel - updateOrCreate 方法,它是不是违反了编程原则
【发布时间】:2021-06-16 17:57:48
【问题描述】:

我在 Laravel - Eloquent 的方法中找到了 updateOrCreate()。 为什么在框架中我们可以找到破坏干净代码和 SOLID 规则的方法?

【问题讨论】:

  • 因为,有时您只是不在乎是其中之一。在这两种情况下,您都希望数据库中有记录,并且它应该是唯一的。如果你不喜欢这样,你不需要使用这个方法。
  • 请说明您认为违反了哪条规则以及原因。
  • @jaco0646 你忘了这个问题吗?
  • @plalx,OP 似乎不愿意在这里付出任何真正的努力,所以我也有同感。对于这种轻率的、开车经过的钓鱼探险来说,你的回答绰绰有余。我介入只是因为第一个答案是如此迅速地接受了 OP 的模糊、未经证实的说法。

标签: laravel solid-principles


【解决方案1】:

我认为您指的是 SOLID 中所述的单一职责原则。长话短说,是的,Laravel PHP 框架中的一些方法会破坏 SOLID,而不仅仅是在 Eloquent ORM 中。

这称为反模式,如Wikipedia 所述:

反模式是对反复出现的问题的常见反应,该问题通常无效并且可能会适得其反。

我们使用这种“反模式”的原因只是为了简单和高效。取决于您的应用程序,使用 ORM(例如 Eloquent)处理数据有时会很复杂,这就是反模式来救援的原因。

使用 eloquent,您可以使用 create() 添加新记录,使用 updateOrCreate() 添加新记录或更新它(如果已存在)。

【讨论】:

  • 我怀疑这里对 SRP 的含义有些混淆。您能否澄清在这种情况下如何违反该原则?
  • 一开始我也对违反哪条原则感到困惑,但我认为 JakiLim 的意思是为什么某些方法可以在 Laravel 中执行许多功能。这就是我提到 SRP 的原因,因为它是声明 every module, class or function in a computer program should have responsibility over a single part of that program's functionality 的唯一原则(参考:Wikipedia)。如果我错了,请随时纠正我:)
  • 不幸的是,维基百科和 OP 一样混乱。它是一个非常糟糕的软件设计来源,因为它被不合格的作者反复编辑。 What is the scope of the Single Responsibility Principle? 应该可以消除一些困惑。
  • 是的,这很令人困惑。由于该主题是基于意见的,因此我将在我的答案中添加您的链接作为参考。谢谢。
  • 这根本不是反模式,看我的回答。
【解决方案2】:

这里没有违反任何原则,也不是反模式,根据定义,这将是代码异味。

我不确定我们在这里讨论的具体实现,但一般来说,“更新或创建”操作必须是原子的,而使用不同的创建、存在和更新操作来实现会很麻烦。

例如,假设客户每次想要进行“更新或创建”时都必须编写以下代码。

if (!exists()) { // this check could be stale without proper locking
   create();
} else {
   update(); // record could have been deleted already
}

正如我们所看到的,这不仅有很多仪式,而且需要使用适当的锁定/重试来确保在我们执行 exists() 检查之后没有立即插入记录,或者在我们之前反向删除记录update().

“更新或创建”在概念上是一个单一的“合并”操作,无法通过一组单独的方法在客户端有效地实现。如果他们称它为merge,你就不会问这个问题了;)

这并不是因为方法名称中有“或”、“与”、“ifNeeded”或其他任何东西,它必然有太多的责任。这是一个强有力的指标,可能确实如此,但请自行判断,不要盲目遵循原则。

【讨论】:

  • 我喜欢这个答案,但我认为第一句话和最后一句话是不一致的。第一句话是正确的:这里没有任何违反(像 OP 中的假设通常基于一些 gross oversimplification)。因为没有违规,所以不需要判断。此外,有效的判断需要理解。缺乏理解是 OP 中的问题,而不是缺乏判断力。
【解决方案3】:

我在 Laravel 框架的 Illuminate/Database 模块中发现了很多违反 SOLID 中的Liskov substitution principle 规则。我不知道作者为什么也这样做。

【讨论】:

    猜你喜欢
    • 2014-02-15
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多