OOPHP 中的双重 Load/Save 对象 - 不必要的重复?

Dual Load/Save Objects in OOPHP - unnecessary duplication?

我在 PHP 中实现了一个(概念上)相当简单的应用程序规范 - 它的大部分内容包括加载项目数据、显示它、允许用户编辑它(可能添加部分),然后将所述数据发送回数据库。

我打算这样处理:

这是不必要的重复吗?我刚刚掌握了 OOPHP,到目前为止我看到的所有建议似乎都表明最好尝试保持一切(对象、方法等)集中且单一-目的尽可能。这似乎符合那个标准,但是有更好的方法吗?

我不知道这是否真的是重复,因为它仍然是一个概念,我认为重复确实发生在实施过程中。作为一个概念,您在 类.

之间很好地分离了关注点

如果您真的很喜欢 OOPHP,不妨查看有关 设计模式 的主题:

根据维基百科:

In software engineering, a software design pattern is a general reusable solution to a commonly occurring problem ... Design patterns are formalized best practices that the programmer can use to solve common problems when designing an application or system.

看来您通过头脑风暴得出了两个概念:

  • 背后的核心思想Data Mappers

  • 分离创建新条目的逻辑 以及检索数据的逻辑(这个想法在CQRS, especially in context of Event Sourcing中非常重要)

但我怀疑,虽然数据映射器对您来说应该很容易掌握,但与 CQRS 相关的第二部分对您来说至少要过一年才能探索。

关于你的问题..
除非你做了一些愚蠢的事情,否则你的 "load object" 和 "save objects" 中不会有太多重复。但是,你可能会在那里提取一个或两个超类。

"advice you have seen" 实际上称为 Single Responsibility Principle 并且是,TBH,是 OOP 中一个更模糊的概念。这就像定义 "porn" 是什么 - 当您看到它时就知道它。

而且,如果您想要更好的方法建议,我建议将读取和写入部分合并到一个数据映射器中。有点像这样:

$project = new Entity\Project;
$mapper = new Mapper\Project($pdo);

$project->setId(43);
$mapper->load($project); //pulls data about project 43 from DB

if ($project->getDeadline() > time()) {
    $project->setStatus(Entity\Project::STATUS_OVERDUE);
    $mapper->save($project);  //pushes changed state to DB
}