Этот код является своего рода шаблоном команды? - PullRequest
1 голос
/ 13 июня 2019

У меня есть метод, который должен выполнить несколько задач, чтобы выполнить большую задачу.Каждая задача может содержать около 20-30 строк кода, поэтому я решил иметь класс для каждой задачи.

public void bigTask() {
    TaskProcessor executor = new TaskProcessor();
    executor.addTask(new Task1(some arguments here));
    executor.addTask(new Task2(some other arguments here));
    executor.addTask(new Task2(some other arguments here));
    executor.run();
}

public interface Task {
    public void execute();
}

public class Task1 implements Task {
    @Override
    public void execute() {
        //Some code here
    }
}

public class Task2 implements Task {
    @Override
    public void execute() {
        //Some other code here
    }
}

public class Task3 implements Task {
    @Override
    public void execute() {
        //Some other code here
    }
}

public class TaskProcessor implements Serializable {

    private List<Task> tasksList;

    public TaskProcessor () {
        this.tasksList = new ArrayList<Task>();
    }

    public void addTask(Task task) {
        this.tasksList.add(task);
    }

    public void execute() {
        for (Task task : this.tasksList) {
            task.execute();
        }
    }
}

Для меня этот код похож на шаблон команды, но я не уверен, потому что аргументыдля каждой задачи различаются типы, в отличие от традиционного шаблона команды.

Как вы думаете, это можно считать реализацией шаблона команды?Думаете ли вы, что этот подход подходит для разделения большого метода?

Спасибо

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Как вы думаете, это можно считать реализацией шаблона команды?

Я думаю, этого достаточно.

Как вы думаете, подходит ли этот подход для разбиения большого метода?

Мы использовали очень похожий подход для разбора длинных «последовательностей» на маленькие «Действия». Но мы добавили разные виды «контейнеров». Как в: иногда у меня есть последовательность действий, которые должны продолжать выполняться, даже если одна запись не удается. В других случаях вся последовательность должна быть немедленно остановлена. Другой вариант - это последовательность, в которой каждое действие также имеет метод undo(), поэтому контейнер последовательности может выполнить откат всех предыдущих (пропущенных) действий при сбое какого-либо действия.

В зависимости от вашего контекста, вы можете быть «хорошими в ходу», но я думаю, что вы должны хотя бы подумать о том, что / если ваши индивидуальные задачи могут не справиться , и как ваш контейнер TaskProcessor должен реагировать на неудачные шаги .

1 голос
/ 13 июня 2019

С точки зрения структуры этот код является приложением шаблона проектирования Command.Отображение участников шаблона в книге «Банды четырех» выглядит следующим образом:

  • Task - это интерфейс Command в шаблоне с его методом execute;
  • Task1-3 - это конкретные команды;
  • TaskProcessor - это Invoker, который «просит команду выполнить запрос»

Однако с точки зрения намерение , есть небольшое несоответствие.Первоначальная цель Командного шаблона, как указано в книге «Банды четырех»:

Инкапсулирует запрос как объект, что позволяет вам параметризировать клиентов с различными запросами, запросами очереди или журнала и поддерживать отмену операций..

Однако вопрос "Как вы думаете, подходит ли этот подход для разбиения большого метода?"предполагает, что цель состоит в том, чтобы обеспечить модульную декомпозицию сложной части вычислений, что не является тем же самым.

...