我尝试创建一个名为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中无法完成。
我是否可以使用其他模式来清除构造函数膨胀?
答案 0 :(得分:0)
您班上可能有几个问题。
首先,您很可能违反了SRP(单一责任原则)。请注意:http://vimeo.com/43592685
二。在构造函数中,您传递所有方法都需要的东西。由于你没有指定任何方法(getter和setter不是我所说的方法),我无法判断你是否需要所有这些参数。在DDD中,您的方法应该反映UL(泛无处不在的语言)。现在,它看起来就像是数据容器(贫血实体)。
Builder模式可以通过各种方式实现,您不需要嵌套类。但是建造者用于不同的目的,你不应该在这里使用它。我只想为此建一个工厂。
我还会考虑使用"规范"模式在这里。