【问题标题】:Data Mapper: Is my interpretation correct?数据映射器:我的解释正确吗?
【发布时间】:2009-12-28 18:54:26
【问题描述】:

我现在想确认一下我对 Data Mapper 模式的看法。所以我们开始:

A 部分: 数据映射器是一个类,用于创建、更新和删除另一个类的对象。示例:一个名为 Cat 的类和一个名为 CatDataMapper 的数据映射器。还有一个名为cats 的数据库表。但它也可以是一个名为cats.xml 的xml 文件,或一个名为cats 的硬编码数组。 Data Mapper 的全部意义在于将使用 Cat 类的业务逻辑从思考“如何获得现有的猫”或“如何拯救猫”、“在哪里拯救猫”的思考中解放出来。作为 Data Mapper 的用户,它看起来像一个带有明确定义的方法的黑盒,例如 getCat(int id)、saveCat(Cat catObject)、deleteCat(Cat catObject) 等。

B 部分: 首先我认为如果 Cat 继承自 CatDataMapper 会很聪明,因为调用这样的函数会更方便一些。例如,像 catWithId(int id) 这样的方法可以是静态的(类方法)并返回一个 Cat 的实例,并使用来自 anywhere 的数据进行初始化。当我在代码中使用 cat 对象时,我可以简单地调用 myCat->save();将其存储在 Data Mapper 将其存储的任何位置(不管在哪里以及如何,Data Mapper 都会向用户隐藏这种复杂性)。

总之,我现在有点困惑;) 您认为 Section A 对 Data Mapper 模式有效吗?如果我按照B 节 中的说明额外执行此操作,会不会很糟糕?为什么?

【问题讨论】:

    标签: oop datamapper


    【解决方案1】:

    我认为您的 Section A 对应于 Martin Fowler

    给出的数据映射器模式的定义

    请注意实现语言的细节。在B 节中,将catWithId() 设为cat 类的静态成员可能会干扰方法的多态行为。

    在 java 中,JVM 会根据引用的声明类型分派一个静态方法。
    试试这个:
    1.用静态方法catWithId(int id)创建一个类CatDataMapper
    2. 创建一个类 Cat 扩展 CatDataMapper 具有所需的业务逻辑行为
    3. 子类CatLoggedCat 记录所有活动,包括来自CatDataMapper的活动
    4. 做Cat foo = new LoggedCat()
    5.做Cat bar = foo.catWithId(5)

    注意调用的是哪个方法,应该是CatDataMapper的静态方法而不是LoggedCat的静态方法

    http://faq.javaranch.com/view?OverridingVsHiding对此进行了更深入的讨论。

    【讨论】:

    • 谢谢。请您解释一下最后一句“在 B 节中 catWithId() 是 cat 类的静态成员可能会干扰方法的多态行为”的意思吗?当 cat 类继承这个静态方法来创建一个基于给定 id 初始化的新 cat 对象时会出现什么问题?
    • 如果您使用 Java 实现,您只需要注意这种极端情况。 catWithId() 方法可能不受这种“陷阱”行为的影响。其他需要多态行为的方法会有问题。不要忘记在 junit 测试中使用的覆盖方法!
    【解决方案2】:

    我认为这是一个不错的方法。除了使用的命名约定之外,您在此处遵循众所周知的数据访问模式,并且您允许 Cat 对象的用户执行 CRUD 操作,而无需与 CatDataMapper 交谈,这在我的书中始终是一个优点。

    如果您身处 Java 世界,我建议您研究一下 Spring Container 技术。

    【讨论】:

      猜你喜欢
      • 2011-07-24
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      相关资源
      最近更新 更多