5

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

public function myMethodThatDoFineStuff(MyObject $myobject) {

}

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

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


澄清示例建议:

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

public function listBookOfAuthor(Author $author) {

}

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

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

4

3 回答 3

2

如果我们想放置的不是所有对象,而是它的一些属性,是强制的,该怎么办?

从技术上讲,您可以创建一个仅具有函数期望的某些属性的接口。孤立这可能看起来有点像开销,但接口值得玩一下,更多地在手册中它们是如何在 PHP 中工作的。

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

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

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

然后您将失去类型提示,但您将能够传递任何对象。取决于您要编写代码的严格程度。如果您使用接口,则在重构代码(更改具体对象实现)以及使用 stclass 对象时会非常灵活。然而,对于 stdclass 对象,函数需要在处理函数输入之前验证它首先得到什么。

于 2011-05-04T15:48:40.240 回答
2

我将通过以下方式测试所需的属性:

public function listBookOfAuthor(Author $author) {

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

}

如果你发现你做了很多,你可以编写某种父类,其中包括一个检查属性是否存在的方法。

于 2011-05-04T15:51:08.447 回答
2

根据您的架构,该方法listBooksOfAuthor()(看起来像服务对象上的方法,如BookService)可能只需要一个$authorId,而不是一个完整的Author对象就足够了。

但我想我理解问题的重点。Author完全填充该对象可能很昂贵 - 例如,从AuthorService::getAuthorById().

对于那些你只需要一个适度的Author功能子集的情况,那么也许你可以创建一个独特的接口——也许像 AuthorSummaryInterface 之类的东西——它只反映你在这些情况下需要的那些方法。允许Author对象实现该接口,以便当您已经拥有一个Author对象时,您可以执行只需要该有限Author功能的操作。或者,您可以创建一个Author:getSummary()返回具体实现的方法AuthorSummaryInterface。在这种方法中,您可以强制执行您的成员要求 - 例如必须有一个名称 - 并在这些要求未满足时引发异常。

您还可以创建一组方法——可能在一个AuthorService对象或一个AuthorSummaryService对象上——产生AuthorSummary对象。然后在只AuthorSummaryInterface需要功能的情况下,您可以创建这些功能有限、创建成本较低的对象。

只是一些想法。

于 2011-05-04T17:16:29.183 回答