OOPHP 中的双重 Load/Save 对象 - 不必要的重复?
Dual Load/Save Objects in OOPHP - unnecessary duplication?
我在 PHP 中实现了一个(概念上)相当简单的应用程序规范 - 它的大部分内容包括加载项目数据、显示它、允许用户编辑它(可能添加部分),然后将所述数据发送回数据库。
我打算这样处理:
有一组基本的 'Load' 对象(例如 ProjectLoad、FormLoad),它们在创建时带有一个 ID,查询数据库并用获取的数据填充自己。然后可以使用这些对象来填充页面元素。
有另一组 'Save' 对象(例如 ProjectSave、FormSave)接受数组(在提交页面时返回),用该数据填充自己,然后执行 INSERT\UPDATE
对数据库的操作。
这是不必要的重复吗?我刚刚掌握了 OOPHP,到目前为止我看到的所有建议似乎都表明最好尝试保持一切(对象、方法等)集中且单一-目的尽可能。这似乎符合那个标准,但是有更好的方法吗?
我不知道这是否真的是重复,因为它仍然是一个概念,我认为重复确实发生在实施过程中。作为一个概念,您在 类.
之间很好地分离了关注点
如果您真的很喜欢 OOPHP,不妨查看有关 设计模式 的主题:
- OOP Design Patterns - 用于基本(构建块)设计模式。
- Martin Fowler's Patterns of Application Architecture - 高级设计模式
根据维基百科:
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
}
我在 PHP 中实现了一个(概念上)相当简单的应用程序规范 - 它的大部分内容包括加载项目数据、显示它、允许用户编辑它(可能添加部分),然后将所述数据发送回数据库。
我打算这样处理:
有一组基本的 'Load' 对象(例如 ProjectLoad、FormLoad),它们在创建时带有一个 ID,查询数据库并用获取的数据填充自己。然后可以使用这些对象来填充页面元素。
有另一组 'Save' 对象(例如 ProjectSave、FormSave)接受数组(在提交页面时返回),用该数据填充自己,然后执行
INSERT\UPDATE
对数据库的操作。
这是不必要的重复吗?我刚刚掌握了 OOPHP,到目前为止我看到的所有建议似乎都表明最好尝试保持一切(对象、方法等)集中且单一-目的尽可能。这似乎符合那个标准,但是有更好的方法吗?
我不知道这是否真的是重复,因为它仍然是一个概念,我认为重复确实发生在实施过程中。作为一个概念,您在 类.
之间很好地分离了关注点如果您真的很喜欢 OOPHP,不妨查看有关 设计模式 的主题:
- OOP Design Patterns - 用于基本(构建块)设计模式。
- Martin Fowler's Patterns of Application Architecture - 高级设计模式
根据维基百科:
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
}