Php 在HP中双重加载/保存对象-不必要的重复?

Php 在HP中双重加载/保存对象-不必要的重复?,php,oop,object,save,Php,Oop,Object,Save,我有一个(概念上)相当简单的应用程序规范,我正在用PHP实现它——它的大部分包括加载项目数据、显示项目数据、允许用户编辑项目数据(可能会添加部分),然后将所述数据发送回数据库 我打算这么做: 拥有一组基本的“加载”对象(例如ProjectLoad、FormLoad),这些对象在创建时使用ID,查询数据库并用获取的数据填充它们自己。然后可以使用这些对象填充页面元素 拥有另一组“保存”对象(例如ProjectSave、FormSave),这些对象接受数组(在提交页面时返回),用这些数据填充自己,然

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

我打算这么做:

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

  • 拥有另一组“保存”对象(例如ProjectSave、FormSave),这些对象接受数组(在提交页面时返回),用这些数据填充自己,然后对数据库执行
    INSERT\UPDATE
    操作


这是不必要的重复吗?我刚刚了解了OOPHP,到目前为止,我看到的所有建议似乎都表明,最好是尽可能地将所有内容(对象、方法等)都集中在一个目标上。这似乎符合这一标准,但有更好的方法吗?

我无法判断这是否真的是重复,因为这仍然是一个概念,我认为在实施过程中确实会发生重复。作为一个概念,您已经很好地将关注点划分到了您的类中

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

  • -用于基本(构建块)设计模式
  • -高级设计模式
根据维基百科:

在软件工程中,软件设计模式是一种通用模式 常见问题的可重用解决方案设计模式是形式化的最佳实践 程序员在设计程序时可以使用它来解决常见问题 应用程序或系统


我不知道这是否真的是重复,因为它仍然是一个概念,我认为在实现过程中确实会发生重复。作为一个概念,您已经很好地将关注点划分到了您的类中

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

  • -用于基本(构建块)设计模式
  • -高级设计模式
根据维基百科:

在软件工程中,软件设计模式是一种通用模式 常见问题的可重用解决方案设计模式是形式化的最佳实践 程序员在设计程序时可以使用它来解决常见问题 应用程序或系统


这看起来像是你通过头脑风暴的方式得出的两个概念:

  • 背后的核心思想

  • 分离创建新条目的逻辑 以及检索数据的逻辑(这个想法在中非常重要,尤其是在

但我怀疑,虽然数据映射器对您来说应该很容易掌握,但第二部分,与CQR相关的部分,对于您来说,可能至少提前一年进行探索

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

“您已经看到的建议”实际上被称为,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
}

这看起来像是你通过头脑风暴的方式得出的两个概念:

  • 背后的核心思想

  • 分离创建新条目的逻辑 以及检索数据的逻辑(这个想法在中非常重要,尤其是在

但我怀疑,虽然数据映射器对您来说应该很容易掌握,但第二部分,与CQR相关的部分,对于您来说,可能至少提前一年进行探索

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

“您已经看到的建议”实际上被称为,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
}

我实际上不同意这个定义。它给人的印象是,设计模式是预先制作的配方或罐装解决方案。依我看,设计模式实际上是简写,开发人员用它来描述已经存在的代码。一个人不“应用模式”。相反,“模式”是从你编写的代码中产生的。我实际上不同意这个定义。它给人的印象是,设计模式是预先制作的配方或罐装解决方案。依我看,设计模式实际上是简写,开发人员用它来描述已经存在的代码。一个人不“应用模式”。相反,“模式”是从你编写的代码中浮现出来的。发现你一直试图在头脑中定义的东西有一个恰当的名称,并且比你已经开始的更深入的探索,这总是很好的。数据映射器看起来正是我所需要的——尽管遗憾的是,PHP并没有持久化对象,所以我不能在结束时只是厚颜无耻地调用save($project)。可能会在Mapper超类中放置一对静态方法,并使用它们按ID或从数组调用加载,很像。是的,我将为CQRS链接添加书签以供将来参考。这个网站应该能够得到与积垢,但指针是非常感谢。我会坚强