php – 将很多参数传递给parent :: __构造代码异味/差OOP?

我正在写一些代码,我开始对凌乱的父:: __构造调用感到有点不舒服,我首先想知道它是不好的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)有足够数量的参数使得使用简单数组就像一长串函数参数一样有问题.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...