2

也许这是一个答案微不足道的问题,但它让我疯狂了几天,所以我想听听答案。我最近正在查找很多与为我自己的项目(而不是使用 ORM)构建自定义数据映射器相关的信息,并阅读了 stackoverflow 或其他网站上的几个线程。

拥有对象似乎非常有说服力AuthorCollection,它们基本上只是一个包含多个实例的Author实例或BookCollection对象的容器Book。但是为什么需要一个映射器来处理单个Author对象呢?我能想到的所有获取标准(除了要求具有指定BookIDor的对象的标准AuthorID)将返回多个BookorAuthor实例,因此BookCollectionorAuthorCollection实例。那么,为什么要为单个对象使用映射器,如果适当集合的映射器更通用,并且您不必确定您的条件只会返回一个结果?

在此先感谢您的帮助。

4

1 回答 1

2

简短的回答

您无需费心为 和 创建两个映射AuthorAuthorCollection。如果您的程序不需要 anAuthorMapper和 anAuthorCollectionMapper就可以顺利运行并拥有干净的源代码,请务必做您最喜欢的事情。

注意:选择此路由意味着您应该格外小心地注意SRP违规。


长(呃)答案

这一切都取决于你想要做什么。为了这篇文章的缘故,我们称之为AuthorMapper项目数据映射器和AuthorCollectionMapper集合数据映射器。

通常,项目映射器不会像它们的集合映射器那样复杂。项映射器通常只会通过主键获取,因此会限制结果,从而使映射器干净且不会被其他特定于集合的东西弄乱。

我提出的这些“特定于集合的事物”的一个主要部分是条件1以及它们如何在查询中实现。通常在集合映射器中,您可能会比通常在项目数据映射器中的查询更高级、更长和乏味。尽管完全可以将您的平均项目数据映射器查询 ( SELECT ... WHERE id = :id) 与复杂的集合映射器查询结合起来而不使用臭名昭著的条件2,但它变得更加复杂,并且当数据库只需要一个简单的通用查询时,它仍然会困扰数据库来执行冗长的查询.

此外,尽管您指出使用项目映射器我们实际上只通过主键获取,但使用项目映射器处理其他事情通常会变得更加简单。与尝试使用集合映射器来保存/删除项目相比,项目映射器save()和方法可以更好地处理(通过正确的实现)这项工作。remove()并且,随着这一点,很明显,有时在使用集合映射器save()remove()方法的过程中,集合映射器可能想要使用项目映射器方法。

在回答您下面的问题时,您可能希望多次设置从数据库中删除行集合的条件。例如,您可能有一个垃圾邮件标志,设置后会隐藏帖子,但会在 30 天内自毁。我是那种情况,你很可能有垃圾邮件标志的条件和时间范围的条件。另一个可能是在删除答案三十天后删除答案下的所有评论。我提到 30 天是因为明智的做法是至少将这些数据保留一段时间,以防有人想要他们的评论,否则带有垃圾邮件标志的行实际上不是垃圾邮件。

1. 这里的条件是指集合实例上集合映射器的查询知道如何处理的属性集。如果您还没有,请在此处查看@tereško 的答案。
2.这个条件不同,指的是人们所说的“邪恶如果” 。如果您不了解他们的邪恶,我建议您观看一些 Clean Code Talks。这是一个特别的,但一切都很棒。

于 2013-08-09T07:06:39.060 回答