OOPHP 中的双重加载/保存对象 - 不必要的重复


Dual Load/Save Objects in OOPHP - unnecessary duplication?

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

我打算这样接近它:

  • 有一组基本的"Load"对象(例如ProjectLoad,FormLoad),它们在创建时获取ID,查询数据库并用获取的数据填充自己。然后,可以使用这些对象来填充页面元素。

  • 有另一组"保存"对象(例如ProjectSave,FormSave),它们采用数组(提交页面时返回),用该数据填充自己,然后对数据库执行INSERT'UPDATE操作。

这是不必要的重复吗?我只是掌握了OOPHP,到目前为止我看到的所有建议似乎都表明,最好尝试使所有内容(对象,方法等)尽可能集中和单一用途。这似乎符合该标准,但是有更好的方法吗?

看起来你设法集思广益,得出了两个概念:

  • 数据映射器背后的核心思想

  • 分离创建新条目的逻辑以及检索数据的逻辑(这个想法在 CQRS 中非常重要,尤其是在事件溯源的上下文中)

但我怀疑,虽然数据映射器应该很容易掌握,但第二个与 CQRS 相关的部分可能至少需要一年的时间才能让您探索。

至于你的问题..
除非你做了一些愚蠢的事情,否则你的"加载对象"和"保存对象"不会有太多重复......但是,您可能会在那里提取一个或两个超类。

"你看到的建议"实际上被称为单一责任原则,TBH,是OOP中一个更模糊的概念。这就像定义什么是"色情"——当你看到它时,就知道它。

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

$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
}

我无法判断这是否真的是重复,因为它仍然是一个概念,我认为重复确实发生在实现过程中。作为一个概念,你已经做得很好,将你的类之间的关注点分开。

如果你真的喜欢OOPHP,你不妨看看关于设计模式的主题:

  • OOP 设计模式 - 用于基本(构建基块)设计模式。
  • Martin Fowler 的应用程序架构模式 - 高级设计模式

根据维基百科:

在软件工程中,软件设计模式是一般的 常见问题的可重用解决方案...设计模式是正式的最佳实践 程序员在设计时可以用来解决常见问题 应用程序或系统。