我有一个(概念上)相当简单的应用程序规范,我正在用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 的应用程序架构模式 - 高级设计模式
根据维基百科:
在软件工程中,软件设计模式是一般的 常见问题的可重用解决方案...设计模式是正式的最佳实践 程序员在设计时可以用来解决常见问题 应用程序或系统。