我所说的正确的 DocBlock 注释是这样的注释:
提供PHPStorm IDE自动完成
这是类本身:
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
层次结构如下所示:
我提供了@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();
}
您认为我的解决方法有哪些陷阱?您会建议什么?
最佳答案
这里的简单答案是,您不应该从单个方法返回多个对象类型。让我详细说明一下:
当我说“类型”时,我指的是并非都以某种方式共享相同类型信息的对象。在你的例子中,它们都是CoreObject
(顺便说一下,这是一个可怕的名字)。因此,我只需将返回类型提示标记为 CoreObject
即可完成。
处理此类问题的首选方法是使用接口(interface),并让您的方法返回该接口(interface)的实现。如果您没有所有返回类型的通用接口(interface),那么您需要实现不同的方法(至少,或者可能是不同的工厂)。
关于php - 类方法的正确 DocBlock 注释,实现了工厂设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15614202/