重构PHP文件以删除代码重复

时间:2017-01-20 16:54:50

标签: php design-patterns refactoring

我有一个导入一些用户的类,转换用户信息然后将其插入数据库。我在文件ImportEmployees上有一个方法,它调用另外两个类来导入数据。一个类使某些用户匹配某些条件,另一个类处理剩余的用户。除了一种方法之外,这两个类完全相同。这一种方法正确地提取用户数据,因此它将调用另外两个不同的类。什么是良好的设计模式,可以很好地处理这个问题,或者更好的方法来解决这个问题,以消除代码重复。

以下是入口点类ImportEmployeesfull class here

public function handle()
{
    handle(new ImportNapaUsers($this->file));
    handle(new ImportNonNapaUsers($this->file));
}

ImportNapaUsers班级:full class here

private function extractUsers()
{
    $users = new ExtractNapaUsers($this->users);
    $this->napaUsers = $users->getUsers();
}

ImportNonNapaUsers班级:full class here

private function extractUsers()
{
    $users = new ExtractNonNapaUsers($this->users);
    $this->napaUsers = $users->getUsers();
}

$this->users在这两个方面完全相同。此外,除extractUsers方法外,两个类都相同。

2 个答案:

答案 0 :(得分:1)

我试着详细说明:

new XYZ
  • 你有一个类方法本身调用全局函数,完全是aginst oop
  • 然后你通过固定使用private function extractUsers() { $users = new ExtractNonNapaUsers($this->users); $this->napaUsers = $users->getUsers(); } 静态调用此函数,也使用oop
  • 那么你的公共句柄()没有返回值,如果出现问题你怎么说?
  • 你的handle()函数似乎什么都没有返回

private
  • 因为方法是$this->extractUsers(new ExtractNonNapaUsers($this->users));,所以会更好:

    private function extractUsers($users) { $this->napaUsers = $users->getUsers(); }

方法变为

foo

这是一个非常复杂的主题,您应该阅读更多相关内容:

https://de.wikipedia.org/wiki/Dependency_Injection

Object Oriented PHP Best Practices

:)

答案 1 :(得分:1)

我不会用设计模式过度复杂化。你需要的是继承和抽象类。

使用抽象方法extractUsers()创建一个抽象类ImportSomeUsers,如下所示

abstract class ImportSomeUsers {
    ...
    abstract protected function extractUsers();
}

然后通过扩展ImportSomeUsers类来定义您的类:

class ImportNapaUsers extends ImportSomeUsers {

    protected function extractUsers() {
        $users = new ExtractNapaUsers($this->users);
        $this->napaUsers = $users->getUsers();
    }
}

class ImportNonNapaUsers extends ImportSomeUsers {

    protected function extractUsers() {
        $users = new ExtractNonNapaUsers($this->users);
        $this->napaUsers = $users->getUsers();
    }
}