我正在写一些代码,我开始对凌乱的父:: __构造调用感到有点不舒服,我首先想知道它是不好的OOP练习,其次是有更清洁的方法吗?请参阅下面触发我的问题的特别极端的示例.
<?PHP
class browseNodeLookupRequest extends Request {
protected $browseNodeId;
public function __construct($Service, $AWSAccessKeyID, $AssociateTag,
$Operation, $MerchantID = null, $ResponseGroup = null,
$Version = null, $Style = null, $ContentType = null,
$XMLEscaping = null, $Validate = null, $browseNodeId) {
parent::__construct($Service, $AWSAccessKeyID, $AssociateTag,
$Operation, $MerchantID, $ResponseGroup, $Version, $Style,
$ContentType, $XMLEscaping);
$this->setbrowseNodeId($browseNodeId);
}
protected function setbrowseNodeId($browseNodeId) {
if (is_string($browseNodeId)) {
$this->browseNodeId = $browseNodeId;
} else {
throw new Exception('browseNodeLookupRequest Parameter (browseNodeId
) Must be a String');
}
}
}
?>
解决方法:
对任何函数都有许多参数是不好的做法,无论是__parent :: construct还是not.
它太容易搞砸了,特别是在PHP中.很多时候,这表明您缺少物体(或者部件之间的耦合太紧).如果你不能提出任何其他缺失的对象,我甚至更愿意传递一个“配置”对象.
class ConfigFoo
{
public $Service, $AWSAccessKeyID, ..., $foo, $bar;
}
$cfg = new ConfigFoo();
$cfg->Service = 'whatever';
...
$req = new browseNodeLookupRequest($cfg);
这基本上是一种传递参数数组的更结构化的方法.配置对象可以扩展其他配置对象以跟随其他对象.
当然,课程可以比简单的公共属性更先进.您可以管理数据完整性等.
需要明确的是:除非a)没有其他缺少的中间对象,否则我不会诉诸上述内容; b)有足够数量的参数使得使用简单数组就像一长串函数参数一样有问题.