Какой уровень абстракции должны быть у сервопереходов?

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

Короче говоря, я делаю Hexapod. Я говорю это, потому что есть некоторые необычные конструктивные соображения: вы не можете сразу перейти от движения вперед к движению назад; так что есть некоторое время перехода. Кроме того, есть время простоя, вот когда нет никаких действий.

Я рефакторинг своего кода, но для достижения этого я обнаружил, что я создаю много методов, которые не должны быть в абстракции верхнего уровня, но ниже:

void loop()
{
// Potentiometer
String action = Controller.action();
Serial.println(action);

// Set the spider to the forward start position
if (action == "toForward")
{
Spidey.toForward();
}

// Move the spider forward
else if (action == "forward")
{
Spidey.forward();
}

// Get it to standby position
else if (action == "fromForward")
{
Spidey.fromForward();
}

// MANY MORE METHODS HERE

// Default action (stand by)
else
{
Spidey.idle();
}

delay(10);
}

На этом уровне только Spidey.forward(); метод должен быть виден, а не переходные. Как установить уровень абстракции для действий перехода?

Мои варианты:

  1. Сделать Controller вернуть другой параметр, «переход», который будет передан вызываемому методу. Проблема: это чрезмерно усложняет код.

  2. Вместо возврата контроллера toForward, forward а также fromForwardверни только forward, а затем сделать Spidey обрабатывать вещи внутренне (хранить переменную lastAction внутри Spidey вместо того, чтобы хранить его Controller как я делаю сейчас). Проблема: это создает намного больше частных методов, однако это нормально в соответствии с вопрос связан.

  3. Любая другая идея?

1

Решение

Это немного зависит от того, что сейчас происходит в Controller. Где-то должен быть класс, который ведет запись о текущем состоянии и обрабатывает последовательность перехода и переводит запрос «вперед» в последовательность, которая выполняет переход промежуточных состояний. Может быть, это Контроллер, или, может быть, это Spidey.

Мне кажется неправильным иметь такой большой блок if для вызова разных функций, основанных на множестве разных магических строк. Это больше похоже на представление очень высокого уровня, которое не обрабатывает промежуточные состояния. Внутренняя логика перехода состояний выглядит более удобной при использовании перечисления. Тогда может быть функция-член toState (), которая бы упорядочивала состояния для достижения этого состояния.

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

1

Другие решения


По вопросам рекламы [email protected]