Лучший шаблон проектирования для выполнения серии шагов

У меня есть приложение, с помощью которого пользователь может инициировать (заполнить форму и нажать «Выполнить») ряд шагов.

Сначала должен быть выполнен шаг 1, а затем шаг 2. Если шаг 2 был успешным, выполните шаг 3, в противном случае выполните шаг 4. Наконец, должен быть выполнен шаг 5.

Каждый шаг содержит от 10 до 100 строк кода.

С помощью какого шаблона проектирования лучше всего структурировать код, чтобы реализовать эту логику? Это шаблон цепочки ответственности, шаблон шаблонного метода или что-то еще?


person Hank Tuff    schedule 08.08.2020    source источник
comment
цепочка ответственности обычно не используется для того, что вы здесь описываете. Но вы можете сделать это   -  person T.S.    schedule 08.08.2020
comment
Так какой же узор, если он есть, здесь лучше всего подходит?   -  person Hank Tuff    schedule 08.08.2020
comment
вы используете шаблон для разработки или вы разрабатываете для использования шаблона?   -  person T.S.    schedule 08.08.2020
comment
Будь проще. Если имеется фиксированный набор шагов, каждый шаг может быть методом, и он может вызвать или иным образом передать ошибку вызывающей стороне.   -  person Aluan Haddad    schedule 09.08.2020
comment
Выполняются ли все пять шагов по нажатию кнопки «Выполнить»? Или вы говорите о каком-то рабочем процессе (или «мастере») с несколькими экранами, которые пользователь должен пролистать?   -  person John Wu    schedule 09.08.2020
comment
Щелчок кнопки. Но должен ли каждый шаг быть классом или методом?   -  person Hank Tuff    schedule 10.08.2020


Ответы (2)


  • Если этапы выполнения вашего кода означают разные состояния системы, при которых она по-разному реагирует на входящие сообщения, то это можно реализовать с помощью Шаблон состояния.

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

  • Если это просто поток выполнения, состоящий из нескольких вызовов функций, то см. ответ Оливье.

person alex_noname    schedule 08.08.2020

Несколько вызовов методов и оператор if-else должны сделать то, что вы хотите.

Step1();
if (Step2()) {
    Step3();
} else {
    Step4();
}
Step5();

Просто позвольте Step2 вернуть логическое значение, чтобы сообщить, было ли оно успешным. Если шаг 2 возвращает некоторые данные, вы также можете вернуть null или пустую коллекцию, если операция не была успешной.

public bool Step2()
{
    //do things
    return <whether successful>;
}

Это просто и легко понять.

Конечно, эти методы могут быть реализованы в разных службах для лучшего разделения задач. Например.

_ui.ShowWaitCursor(); // Step 1.
var data = _fileService.GetData(); // Step 2.
if (data != null) { // Check success of step 2.
    _dbService.WriteData(data); // Step 3.
} else {
    _dbService.WriteDefaults(); // Step 4.
}
_ui.HideWaitCursor(); // Step 5.

См. также: Внедрение зависимостей (Википедия). Если вы ищете лучший способ организовать свой код, это стоит посмотреть.

person Olivier Jacot-Descombes    schedule 08.08.2020