如何在模型结构上表示强制业务字段?

时间:2011-05-04 15:38:25

标签: php oop zend-framework domain-model

如果我们使用类型提示,我们可以强制放置一个对象:

public function myMethodThatDoFineStuff(MyObject $myobject) {

}

如果,我们想要放置,而不是所有对象,而只是它的一些属性,这是强制性的?让我们假设我们的域模型会更好,如果它更好地代表某个域。如果这对我们的业务模型(在我们的域上)更有意义?我们该怎么做?

我们应该始终放置 ALL对象,无论如何?


澄清的示例建议:

让我们想象一下,为了列出某位作者的书籍,我们有这种方法:

public function listBookOfAuthor(Author $author) {

}

现在,让我们假设作者对象有200个属性,但是,为了处理书籍列表,我们只需要他们的第一个姓氏

我们是否应该收到ALL $ author对象?

3 个答案:

答案 0 :(得分:2)

  

如果我们想要将所有对象(而不仅仅是其中的一些属性)放置为强制性,该怎么办?

从技术上讲,您可以创建一个只包含函数所需的某些属性的接口。隔离这可能看起来有点像开销,但接口值得玩,more in the manual它们如何在PHP中工作。

  

仅仅因为它对我们的商业模式更有意义吗?

我对你的商业模式一无所知,所以我不能说它是否有意义。但我以为你问的是编程问题而不是商业问题。

  

我们应该始终将ALL对象放在哪里?

然后你会松开类型暗示,但你可以传递任何物体。取决于你想要编写代码的严格程度。如果使用接口,则在重构代码(更改具体对象实现)以及stclass对象时非常灵活。但是对于stdclass对象,函数需要在处理函数输入之前验证它的第一个。

答案 1 :(得分:2)

我会按以下方式测试所需的属性:

public function listBookOfAuthor(Author $author) {

    if (empty($author->firstName)) {
        throw new listBookOfAuthorException('firstName must be defined');
    }

}

如果你发现你正在做这个批次,你可以写一些包含检查属性的方法的父类。

答案 2 :(得分:2)

根据您的架构,方法listBooksOfAuthor()(看起来像服务对象上的方法,如BookService)可能只有$authorId,而不是完整{{1}对象。

但我认为我理解问题的关键。也许Author对象在完全填充方面很昂贵 - 例如,从Author这样的方法。

对于那些您需要的只是AuthorService::getAuthorById()功能的适度子集的情况,那么也许您可以创建一个独特的接口 - 可能类似于AuthorSummaryInterface - 只反映那些情况所需的那些方法。允许Author对象实现该接口,以便在您拥有Author对象时,可以执行仅需要有限Author功能的操作。或者,您可以创建一个方法Author,该方法返回Author:getSummary()的具体实现。在此方法中,您可以强制执行您的成员要求 - 必须具有名称(例如) - 并在未满足这些要求时抛出异常。

您还可以创建一组方法 - 可能在AuthorSummaryInterface对象或AuthorService对象上 - 生成AuthorSummaryService个对象。然后,在只需要AuthorSummary功能的情况下,您可以创建这些有限的功能,创建更便宜的对象。

只是一些想法。