多个项目的类别

时间:2018-04-10 15:51:01

标签: php design-patterns

我有一个公司类,以及一个 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将为挪威征收所有税款。这是特别的,因为每次我在那里创建一个公司,我将不得不使用完整的列表,所以它似乎是一种更好的组织代码的方式?

1 个答案:

答案 0 :(得分:1)

在我看来,你正在打破那里的OCP。您的课程中有硬编码配置。此外,该公司的一部分。税收适用于公司的收入和/或收入。

您应该创建具有共同征税行为的类,而不是按每个税收为每个国家/地区创建一个类。例如,您创建了一个类(实现Taxation接口),用于应用已定义百分比的税,具有指定的"免税金额"。然后你将拥有另一个具有相同界面的类,它将基于百分比的税收应用于固定的"最大金额"。那意味着,你只需要两个班级。您只需使用特定的构造函数参数初始化它们。

此外,这种方法可以让您在数据库中保留税收的分类列表并进行配置,为每个国家/地区的特定公司应用哪些税。