php - 类方法的正确 DocBlock 注释,实现了工厂设计模式

标签 php oop autocomplete phpstorm phpdoc

我所说的正确的 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();
    }
}

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

当前 Core_Object 层次结构如下所示:
enter image description here

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

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

问题:
如果 Core_Object 层次结构增长到这样的程度会怎样? enter image description here

这将使@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();
}

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

最佳答案

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

当我说“类型”时,我指的是并非都以某种方式共享相同类型信息的对象。在你的例子中,它们都是CoreObject(顺便说一下,这是一个可怕的名字)。因此,我只需将返回类型提示标记为 CoreObject 即可完成。

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

关于php - 类方法的正确 DocBlock 注释,实现了工厂设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15614202/

相关文章:

Php MySQL - 按限制删除所有行

objective-c - OOP:设计菜单系统

c++ - 编译器能内联这个方法吗?

c++ - 使用 VIM 进行带自动完成功能的 C++/Qt 开发

jquery - 自动完成功能不适用于 ajax 生成的文本框

php - Laravel - 如何从 Laravel 代码中的 json 中提取值

PHP PDO MySQL LIKE 和准备好的语句

php - CakePHP,如何从另一个表获取值

java - 返回数组的语义

javascript - 使用 typeahead 在 C# 中自动完成不起作用