2

我所说的正确 DocBlock 评论的意思是这样的评论:

这是课程本身:

class Factory_DomainObjects
{
    /**
     * Build domain object
     *
     * @param $name
     *
     * @return M_UserObject|M_TransactionObject
     */
    public function build($name)
    {
        $class = 'M_' . $name . 'Object';
        return new $class();
    }
}

Core_Object它根据$name参数 从层次结构中返回一个对象。

当前Core_Object层次结构如下所示:
在此处输入图像描述

我提供@return了带有M_UserObject|M_TransactionObject类型描述的标签。它为 PHPStorm 提供自动竞争并符合 PHPdoc 标准。

- 但这正是你想要的,有什么问题?
- 是与否,请继续阅读 :)

问题
如果Core_Object层次结构会发展到这样的程度怎么办? 在此处输入图像描述

这会将@return标签描述变成一团糟:

/**
 * @return M_TransactionObject|M_UserObject|M_Foo|M_Foo1|M_Foo2|M_Foo3|M_Bar|M_Bar1|M_Bar2|M_Bar3
 */

到目前为止我发现的唯一解决方法:build对每个对象使用单独的方法,即

/**
 * Build user domain object
 * 
 * @return M_UserObject
 */
public function buildUser()
{
    return new M_UserObject();
}

/**
 * Build transaction domain object
 * 
 * @return M_TransactionObject
 */
public function buildTransaction()
{
    return new M_TransactionObject();
}

你认为我的解决方法有什么陷阱?你会建议什么?

4

3 回答 3

6

这里的简单答案是您不应该从单个方法返回多个对象类型。让我详细说明:

当我说“类型”时,我的意思是对象并不都以某种方式共享相同的类型信息。在你的情况下,它们都是CoreObject(顺便说一句,这是一个可怕的名字)。所以我会简单地将返回类型提示标记为CoreObject并完成它。

处理此类事情的首选方法是使用接口,并让您的方法返回该接口的实现。如果您没有针对所有返回类型的通用接口,那么您需要实现不同的方法(至少,或者可能是不同的工厂)。

于 2013-03-25T14:48:13.997 回答
1

建议的方法是首先放置通用类型(如果您的工厂创建特定类型的子类型,那么这就是类型),然后您可以添加所有子类型(或重要的子类型)。

这通常对 PHPStorm 非常有效,并且根本不违反 PHPDoc。

/**
 * @return M_TransactionObject|M_UserObject|M_Foo|M_Foo1|M_Foo2|M_Foo3|M_Bar|M_Bar1|M_Bar2|M_Bar3
 */

这太多了。我通常使用@return标记的(子)类型不超过三种。我会说这是一个很好的经验法则。

例如:

 * @return M_UserObject|M_TransactionObject

在我眼里没问题。一个类似的提示动作是:

 * @return array|string[]

或者

* @return Iterator|string[]

第一种类型表示已定义的用途(例如,最后一行是getIterator()of IteratorAggregate),替代类型对于解决 IDE-Typehinting 的缺陷很有用(PHPStorm 对此非常有用)。

HTH。@ircmaxell 写的没有错,但是如果您将第一个返回类型保留为他的意思(接口在那里),只要您了解替代类型仅用于类型提示,您就可以了。如果一个工厂方法返回许多不同的“类型”,那么所有这些都应该共享一个接口。这个很重要。例如,如果您看到一长串列表,则应该有一种类型,并且一种类型是接口。

于 2013-04-12T01:03:52.187 回答
1

目前不可能。

观看此票以了解何时实施:http: //youtrack.jetbrains.com/issue/WI-6027

如果您不想为每个类使用单独的方法,那么我可能只建议对局部变量使用 PHPDoc @var 注释(这可能非常不方便 - 取决于您如何使用它):

/** @var M_FooObject $myFoo */
$myFoo = $factory->build('Foo');
于 2013-03-25T13:25:10.293 回答