шаблоны проектирования — рефакторинг PHP-файла для устранения дублирования кода

У меня есть класс, который импортирует некоторых пользователей, преобразует информацию о пользователях и затем вставляет ее в базу данных. У меня есть файл ImportEmployees у него есть метод, который вызывает 2 других класса для импорта данных. Один класс получает некоторых пользователей, соответствующих определенным критериям, а другой обрабатывает остальных пользователей. Эти два класса делают одно и то же, за исключением одного метода. Этот один метод — то, что правильно извлекает пользовательские данные, так что есть 2 дополнительных, различных класса, которые он будет вызывать. Что такое хороший шаблон проектирования, который хорошо это обрабатывает, или лучший способ справиться с этим, чтобы устранить дублирование кода.

Вот класс точки входа ImportEmployees: полный класс здесь

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

И ImportNapaUsers учебный класс: полный класс здесь

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

И ImportNonNapaUsers учебный класс: полный класс здесь

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

$this->users точно так же в обоих из них. Кроме того, оба класса идентичны, за исключением extractUsers метод.

1

Решение

Я не стал бы слишком усложнять это шаблонами проектирования. Что вам нужно, это наследование и абстрактные классы.

Создать абстрактный класс ImportSomeUsers с помощью абстрактного метода extractUsers (), как это

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();
}
}
1

Другие решения

Я пытаюсь уточнить это:

 public function handle()
{
handle(new ImportNapaUsers($this->file));
handle(new ImportNonNapaUsers($this->file));
}
  • У вас есть метод класса, который сам вызывает глобальную функцию, полностью aginst oop
  • Затем вы статически вызываете эту функцию с фиксированным использованием new XYZтакже против упс
  • Тогда ваш public handle () не имеет возвращаемого значения, как вы заметите, если что-то пойдет не так?
  • Также ваша функция handle (), кажется, ничего не возвращает

А также:

private function extractUsers()
{
$users = new ExtractNonNapaUsers($this->users);
$this->napaUsers = $users->getUsers();
}
  • так как метод private это было бы лучше:

    $this->extractUsers(new ExtractNonNapaUsers($this->users));

И метод становится

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

Это очень сложная тема, вы должны прочитать о ней больше:

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

Объектно-ориентированный PHP Best Practices

🙂

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector