微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel - updateOrCreate 方法,是不是打破了编程原则

如何解决Laravel - updateOrCreate 方法,是不是打破了编程原则

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

解决方法

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

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

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

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

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

,

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

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

>

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

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

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

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

并不是因为方法名称中有“or”、“and”、“ifNeeded”或其他任何东西,所以它必然有太多的责任。这是一个强有力的指标,可能是这种情况,但请使用您自己的判断,不要盲目遵循原则。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?