2017-01-20 7 views
1

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

Вот точка входа класса ImportEmployees: full 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.

+0

'' identical' Нету новый ExtractNapaUsers' является а не 'new ExtractNonNapaUsers' методы не совпадают. Это ваш код на git? А если нет: зачем вы хотите это изменить? – JustOnUnderMillions

+0

Игнорировать мой первый комментарий. «Изначальная инъекция« хорошего дизайна »- это первая задача поиска. Ваш метод 'handle()' действительно против хорошего oop. запретить использование 'new' в методе класса – JustOnUnderMillions

+0

@JustOnUnderMillions. Я хотел бы, чтобы вы разработали. – dericcain

ответ

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

@dericcain Это ваше решение! – JustOnUnderMillions

+0

@JustOnUnderMillions Это определенно сокращает дублирование. Я очень ценю ваши мысли о DI. Это то, о чем я не думал. – dericcain

1

Я пытаюсь разработать это:

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

И:

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

Object Oriented PHP Best Practices

:)

Смежные вопросы