DDD Bloated构造函数参数

时间:2014-07-03 10:39:31

标签: php oop design-patterns domain-driven-design

我尝试创建一个名为Vacancy的相当复杂的域名,详情如下:

Vacancy.php

class Vacancy extends AbstractEntity implements AggregateRootInterface {
    private $employer;
    private $title;
    private $employerInformation;
    private $position;
    private $category;
    private $employmentInformation;
    private $hideSalary = false;
    private $requiredPerson = 1;
    private $yearsExp = 0;
    private $location;
    private $benefits;
    private $qualification;
    private $details;
    private $postedOn;
    private $lastPostPackage;
    private $expiredOn;
    private $visible = true;

    public function __construct(
        PackageOnHand $package,
        $title,
        Position $position,
        JobCategory $category,
        $employerInformation,
        EmploymentInformation $employmentInformation,
        City $location,
        $qualification
    ) {
        parent::__construct();

        $this->employer = $package->getEmployer();
        $this->title = $title;
        $this->position = $position;
        $this->category = $category;
        $this->employerInformation = $employerInformation;
        $this->employmentInformation = $employmentInformation;
        $this->location = $location;
        $this->setQualification($qualification);
        $this->benefits = new ArrayCollection();
        $this->details = new ArrayCollection();
    }

    // Bunch of setters, getters and methods I don't even want to mention
}

EmploymentInformation类已经封装了4个必需参数,这使得它成为一个实体(我个人觉得它错了)。

可以看出,这个特定领域模型的构造函数扩展到8个参数,更不用说添加更多参数了。

问题是,所有这些参数都需要才能使单个Vacancy进入有效状态。

我在this SO question中读到了关于Builder Pattern的内容,但它建议将Builder类放入一个嵌套类中,这在PHP中无法完成。

我是否可以使用其他模式来清除构造函数膨胀?

1 个答案:

答案 0 :(得分:0)

您班上可能有几个问题。

首先,您很可能违反了SRP(单一责任原则)。请注意:http://vimeo.com/43592685

二。在构造函数中,您传递所有方法都需要的东西。由于你没有指定任何方法(getter和setter不是我所说的方法),我无法判断你是否需要所有这些参数。在DDD中,您的方法应该反映UL(泛无处不在的语言)。现在,它看起来就像是数据容器(贫血实体)。

Builder模式可以通过各种方式实现,您不需要嵌套类。但是建造者用于不同的目的,你不应该在这里使用它。我只想为此建一个工厂。

我还会考虑使用"规范"模式在这里。