代码之家  ›  专栏  ›  技术社区  ›  Sander Marechal

DataMapper模式是否破坏MVC?

  •  8
  • Sander Marechal  · 技术社区  · 15 年前

    我一直在阅读多个PHP框架,特别是Zend框架,但我对正确的前进方向感到困惑。

    Zend Framework不使用ActiveRecords,而是使用表数据网关和行数据网关模式,并使用数据映射器将行数据网关的内容映射到模型,因为当模型没有与数据库表的1:1映射时,ActiveRecord会崩溃。有一个 example of this

    对我来说,他们的例子看起来非常臃肿,到处都是能手和二传手。我在博客上看到过很多关于域驱动设计的文章,他们认为使用太多的getter和setter是一种不好的做法,因为它将所有内部模型数据公开给外部,因此与公共属性相比没有优势。 Here is one example .

    我真的很感激一些(链接到)好的例子或更多关于如何将所有这些结合在一起的信息。我正在努力提高我的建筑和设计技能。

    5 回复  |  直到 15 年前
        1
  •  2
  •   TomáÅ¡ Fejfar    15 年前

    您不需要实现所有的getter/setter,您可以使用\uuuget()和\uuuu set()。那有什么问题?

        2
  •  2
  •   Kevin Swiber    15 年前

    使用值对象,可以消除一些公共setter方法。下面是对 the difference between Entity and Value Objects . 值对象是不可变的,并且通常绑定到实体。如果使用构造函数传递所有值,则不需要从外部代码设置这些属性。

    Fowler's interpretation of a Repository 可能会说不。但是,Eric Evans说DDD存储库可以非常简单。最简单的说,就是一个存储库 数据映射器(参见DDD手册)。有关更复杂且仍然是DDD的内容,请参阅Fowler文章。DDD有一个可能与模式定义不同的概念存储库。

        3
  •  1
  •   Jim Baugh Jim Baugh    15 年前

    从我对这篇文章的阅读来看,这个问题更具哲理性,而非实用性。

    我没有时间深入写,但这是我的两分钱。虽然我同意您希望限制get和set请求的数量,因为类应该隐藏其内部,但您还需要考虑到Java和PHP是不同的工具,具有不同的用途。在web环境中,每个请求都会生成和删除您的类,因此您编写的代码不应该依赖于大型类。在文章中,您指出作者建议将视图逻辑放在类中。这在web上可能没有意义,因为我可能希望以多种格式(rss、html等)呈现视图。因此,使用访问器方法(get&set)是一个必要的缺点。你还是要深思熟虑地使用它们,这样你就不会射中自己的脚。关键是让你的班级为你做工作,而不是强迫他们在外部做工作。通过使用方法而不是直接访问属性,可以隐藏所需的内部内容。

    同样,这篇文章可以举一些例子,但我现在没有时间。

        4
  •  1
  •   blockhead    15 年前

    “告诉-不要问”要求对象外部化的唯一方式是从对象本身。换句话说,要渲染对象,您将有一个渲染方法,但该渲染方法需要与接口对话。 大概是这样的:

    class DomainObject {
       ....
       public function render(DomainObjectRenderer $renderer) {
            return $renderer->renderDomainObject(array $thegorydetails);
       }
    }
    

    在Zend Framework的上下文中,您可以将Zend_视图子类化,并让您的子类实现此接口。

    第二个选项是将域模型转换为ViewModel对象,它类似于数据的简化、平展、“串列”视图,针对每个特定视图进行自定义(每个视图一个ViewModel),在返回时,将POST数据转换为EditModel。

        5
  •  0
  •   inxilpro    15 年前

    在我看来,实现getter和setter有两个优点:

    1. 您可以选择公开哪些属性,因此不必公开模型的所有内部内容