У меня есть класс, который импортирует некоторых пользователей, преобразует информацию о пользователях и затем вставляет ее в базу данных. У меня есть файл 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
метод.
Я не стал бы слишком усложнять это шаблонами проектирования. Что вам нужно, это наследование и абстрактные классы.
Создать абстрактный класс 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();
}
}
Я пытаюсь уточнить это:
public function handle()
{
handle(new ImportNapaUsers($this->file));
handle(new ImportNonNapaUsers($this->file));
}
new XYZ
также против упсА также:
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
🙂