Использование шаблона проектирования Command для устранения дублирующегося кода - PullRequest
0 голосов
/ 26 февраля 2019

Допустим, у меня есть программа, которая может создавать и удалять файлы.И у меня есть 2 разных способа сделать это - либо запустить внешние утилиты, которые уже имеют дело с этими действиями, либо реализовать создание и удаление из моей программы.Я хочу выбрать оба варианта и выбрать подходящий динамически во время выполнения.Таким образом, у меня были бы интерфейсы и реализации, подобные этому:

class IFile:
    def create():
        pass

    def delete():
        pass

class ExecFile(IFile):
    def create():
        # Call an external executable

    def delete():
        # Call an external executable

class ImplFile(IFile):
    def create():
        # Implement creation of the file

    def delete():
        # Implement deletion of the file

Таким образом, я могу выбрать любой из них во время выполнения и использовать его.Но что, если я решу создать другую реализацию, представляющую собой смесь между ExecFile и ImplFile, поэтому функция create() будет такой же, как в ExecFile, но будет удалена так же, как в ImplFile (или некоторых другихих сочетание).Я подумал о решении этой проблемы с использованием шаблона проектирования команд и сделал что-то вроде следующего:

class IFile:
    def create():
        pass

    def delete():
        pass

class IFileAction:
    def exec():
        pass

class ExecCreateFile(IFileAction):
    def exec():
         # Call an external executable to create file

class ImplCreateFile(IFileAction):
    def exec():
        # Implement creation of the file

class ExecDeleteFile(IFileAction):
    def exec():
         # Call an external executable to delete file

class ImplDeleteFile(IFileAction):
    def exec():
        # Implement deletion of the file


class ExecFile(IFile):
    def create():
        ExecCreateFile().exec()

    def delete():
        ExecDeleteFile().exec()


class ImplFileIFile(IFile):
    def create():
        ImplCreateFile().exec()

    def delete():
        ImplDeleteFile().exec()


class ExecImplFile(IFile):
    def create():
        ExecCreateFile().exec()

    def delete():   
        ImplDeleteFile().exec()

Вопрос: было бы целесообразно использовать этот шаблон проектирования в данном конкретном случае, или что-то лучше можно было бы сделать?Единственное, что меня беспокоит, это то, что если бы пример был более сложным, скажем, я добавил опцию, чтобы получить размер файла, получить владельца файла и т. Д., Я бы закончил тем, что создал несколько классов типа IFileAction, которые в основном выполняют только одно действие.

PS Это может быть плохой пример, но не мог придумать ничего лучшего.Кроме того, вопрос не относится конкретно к Python, просто использовал его для представления примера.

1 Ответ

0 голосов
/ 26 февраля 2019

Композитор является ответом.Вы должны сохранить интерфейс, в то время как реализация потребляет оба экземпляра (как правило, через конструктор) и запускает для них соответствующие методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...