php - 大型应用ActiveRecord的设计问题

标签 php laravel oop design-patterns eloquent

在大多数框架中,您都有表示数据库中行的模型类。

例如php代码:

class User extends Model {}

我给了 Laravel Eloquent 例子,但这对大多数 php 框架都是正确的。

然后在类中添加关系:

public function pictures()
{
    return $this->hasMany('App\Picture');
}

然后你添加一些这样的方法:

public function deleteComments()
{
    // delete comments code here
}

我的第一个问题是:这是好的设计架构吗,因为多年后当项目变大时,您将与用户建立许多关系(图片、评论、帖子、订阅等)。 该类可能会变成 10k 行左右的代码。

那样的话,类会变得非常庞大,难以维护。 此外,单一责任原则可能会被违反,因为您在一个类中有太多方法。

此外,如果我想在另一个应用程序中使用该类,我不能,因为我还必须在第二个应用程序(网站)中提取图片、评论等。

如果我制作其他类,如“UserPictures”、“UserPictureDeleter”,代码将变得更加复杂。

这也是一种很好的做法吗?如果不是,您对如何使代码不因方法过多而变得臃肿而易于使用有什么建议吗? 您是否同意所有这些方法都属于 User 类?

最佳答案

Laravel 和其他一些框架提供 Active Record在他们的模型基类中的概念。 Active Record 的主要思想是将表行表示为一个对象,其中包括行的数据和使用数据库的方法。

在小型简单应用程序中使用 Active Record 模式是完全合理的,因为这种模式提供了快速开发应用程序的能力。但是如果你的应用程序有很多代码和困难的业务逻辑,Active Record 会给你的应用程序架构带来很多问题。 Active Record 会产生以下问题:

  • 违反单一职责原则,导致代码臃肿。 Active Record 总是违反这个原则,因为它总是有两个职责:它实现业务逻辑和数据库工作的方法
  • 违反低耦合原则 (GRASP),使代码重用更加困难
  • 如果您使用 Active Record 模式,则很难创建合格的抽象

这些问题的解决方案是使用 OOP 抽象而不是使用表行抽象。例如,您可以使用 Domain ModelDomain-driven design .对于大型应用程序,这种方法优于 Active Record 模式。

不幸的是,这些概念篇幅太大,无法在本文中进行解释,但您可以阅读 Eric Evans 的“领域驱动设计”。这是一本关于应用程序设计的好书。此外,您可以在 google 中找到许多关于这些概念的文章。例如Building a Domain Model , Implementing Domain-Driven Design in PHP (拉维尔)

关于php - 大型应用ActiveRecord的设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53348905/

相关文章:

laravel - 未找到类 'Monolog\Logger' - 全新安装问题

java - 多层继承 - Java

Pythonic 方式循环对象属性并分配新属性

php - 原始查询到 Eloquent

php - 使用 PHP 创建自然语言搜索引擎

php - 使用 eloquent laravel 获取连接表数据

PHP根据条件比较关联数组

java - 实例化类型参数而不传递对象

php - 如何在 PHP 中创建合适的相册应用程序?

PHP json_encode,数组在 javascript 中未正确显示