我有一个公司类,以及一个 Tax 类。根据创建公司的国家/地区,我为此公司创建了多个税对象。例如,如果国家是挪威,我默认需要创建4个税对象。
现在有了这个结构,我首先为每个不同的Tax创建了一个类。例如,我有两种税:
class TaxNorway11 extends Tax {
public function __construct($companyID, $config = []) {
$this->name = 'Tax 11.00%';
$this->percentage = 11;
$this->company = $companyID;
parent::__construct($config);
}
}
class TaxNorway12 extends Tax {
public function __construct($companyID, $config = []) {
$this->name = 'Tax 12%';
$this->percentage = 12;
$this->company = $companyID;
parent::__construct($config);
}
}
然后我创建了一个TaxFactory来检查$ country并相应地创建Tax Objects:
class TaxFactory {
public function build() {
switch ($country) {
case self::NORWAY_ID:
$tax11 = new TaxNorway11($this->companyID);
$tax15 = new TaxNorway15($this->companyID);
$tax12 = new TaxNorway12($this->companyID);
$this->taxes = array($tax11, $tax12, $tax15);
break;
}
return $this->taxes;
}
}
我有多个国家,因此我最终会创建许多类,每个Tax对象一个。我的问题是,有没有办法可以创建一个由列表组成的类,例如NorwayTaxes将为挪威征收所有税款。这是特别的,因为每次我在那里创建一个公司,我将不得不使用完整的列表,所以它似乎是一种更好的组织代码的方式?
答案 0 :(得分:1)
在我看来,你正在打破那里的OCP。您的课程中有硬编码配置。此外,该公司不的一部分。税收适用于公司的收入和/或收入。
您应该创建具有共同征税行为的类,而不是按每个税收为每个国家/地区创建一个类。例如,您创建了一个类(实现Taxation
接口),用于应用已定义百分比的税,具有指定的"免税金额"。然后你将拥有另一个具有相同界面的类,它将基于百分比的税收应用于固定的"最大金额"。那意味着,你只需要两个班级。您只需使用特定的构造函数参数初始化它们。
此外,这种方法可以让您在数据库中保留税收的分类列表并进行配置,为每个国家/地区的特定公司应用哪些税。